MENU

如何获取Gmail账号OAuth授权的refresh_token

May 13, 2024 • 已被 101 位童鞋围观过 • 代码分享

获取 refresh_token 本身并不需要申请额外的特殊权限。只要正确遵循 Google OAuth 2.0 的授权流程,并满足以下条件,就能在授权响应中获得 refresh_token:

  1. 在创建 OAuth 客户端时,将应用类型设置为 Web 应用程序

这是因为根据 Google 的政策,只有 Web 应用程序类型的客户端才能获取 refresh_token。

  1. 为 Google 客户端设置正确的重定向 URI

重定向 URI 是 Google 将用户导向的地址,用于获取授权码或访问令牌。确保该 URI 设置正确。

  1. 请求合适的 OAuth 作用域(Scopes)

不是所有 Google API 的作用域都支持 refresh_token。您需要请求那些允许获取 refresh_token 的作用域。常见的支持 refresh_token 的作用域包括:

  1. 使用服务器端授权码流程

Google 推荐使用服务器端授权码流程来获取 refresh_token。这需要先获取授权码,再使用授权码请求令牌端点获取 access_token 和 refresh_token。

  1. 设置 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存活状态,前提是账号没有取消授权!