为了获取
refresh_token
,您需要在OAuth请求URL中包含
access_type=offline
。当用户首次进行身份验证时,您将收到一个非空的
refresh_token
以及一个过期的
access_token
。
如果您有这样一种情况:用户可能会重新对您已经拥有认证令牌的帐户进行身份验证(就像@SsjCosty上面提到的那样),您需要从Google获取有关该令牌所属帐户的信息。要做到这一点,请将
profile
添加到您的范围中。使用OAuth2 Ruby gem,您的最终请求可能看起来像这样:
client = OAuth2::Client.new(
ENV["GOOGLE_CLIENT_ID"],
ENV["GOOGLE_CLIENT_SECRET"],
authorize_url: "https://accounts.google.com/o/oauth2/auth",
token_url: "https://accounts.google.com/o/oauth2/token"
)
client.authorize_url(
scope: "https://www.googleapis.com/auth/analytics.readonly profile",
redirect_uri: callback_url,
access_type: "offline",
prompt: "select_account"
)
请注意,范围有两个用空格分隔的条目,一个是只读访问 Google Analytics,另一个是
profile
,这是 OpenID Connect 标准。
这将导致 Google 在
get_token
响应中提供一个名为
id_token
的附加属性。要从 id_token 中获取信息,请参阅 Google 文档中的
此页面。有一些由 Google 提供的库可以验证和“解码”它(我使用 Ruby 的
google-id-token gem)。一旦解析它,
sub
参数就是唯一的 Google 帐户 ID。
值得注意的是,如果您更改了范围,那么已经使用原始范围进行身份验证的用户将再次收到刷新令牌。如果您已经有很多用户,并且不想让他们全部取消 Google 应用的授权,则此功能非常有用。
哦,最后要注意的一点是:你不必须prompt=select_account
,但如果你的用户可能想要使用多个Google账户进行身份验证(即,你不是用它进行登录/身份验证),那么这将非常有用。