获取 refresh_token 本身并不需要申请额外的特殊权限。只要正确遵循 Google OAuth 2.0 的授权流程,并满足以下条件,就能在授权响应中获得 refresh_token:
- 在创建 OAuth 客户端时,将应用类型设置为 Web 应用程序
这是因为根据 Google 的政策,只有 Web 应用程序类型的客户端才能获取 refresh_token。
- 为 Google 客户端设置正确的重定向 URI
重定向 URI 是 Google 将用户导向的地址,用于获取授权码或访问令牌。确保该 URI 设置正确。
- 请求合适的 OAuth 作用域(Scopes)
不是所有 Google API 的作用域都支持 refresh_token。您需要请求那些允许获取 refresh_token 的作用域。常见的支持 refresh_token 的作用域包括:
- https://www.googleapis.com/auth/userinfo.email
- https://www.googleapis.com/auth/userinfo.profile
- https://www.googleapis.com/auth/drive
- https://www.googleapis.com/auth/calendar
等等
- 使用服务器端授权码流程
Google 推荐使用服务器端授权码流程来获取 refresh_token。这需要先获取授权码,再使用授权码请求令牌端点获取 access_token 和 refresh_token。
- 设置 Access Type 为 offline
在创建 Google 客户端时,需要调用 setAccessType('offline')
以通知 Google 您需要 refresh_token。
只要满足上述条件,不需要申请任何特殊权限,Google 就会在授权响应中包含 refresh_token。如果仍然获取不到,可能是配置有误或 Google 账号/项目本身的问题,需要进一步检查。
设置代码如下
public function __construct(){
$this->client = new \Google\Client();
$this->client->setClientId('客户端 ID');
$this->client->setClientSecret('客户端密钥');
$this->client->setRedirectUri('callback地址');
$this->client->addScope('openid profile email');
$this->client->setAccessType('offline');
$this->client->setPrompt('consent');
}
注意的几个点
必须要设置 setAccessType('offline'); 这个获取到refresh_token的关键
另外一个点是要设置 setPrompt('consent'); 如果不设置 授权完成后不会返回refresh_token(这个问题巨坑,我在这个点上面花费了巨量的时间。才找到问题的症结。)
使用refresh_token可以判断Gmail账号的存活状态,适用于批量检测Gmail存活状态,前提是账号没有取消授权!