如何使 Google 登录令牌的有效期超过 1 小时?

How to make Google sign-in token valid for longer than 1 hour?

我已成功实施 google 登录。

我能够对用户进行身份验证,作为响应,我收到了令牌。但是令牌将在 1 小时后过期。

expires_in: "3600"

我尝试在文档中搜索 - https://developers.google.com/identity/sign-in/web/reference - 但找不到延长令牌寿命的参数。


我到底想做什么?

https://developers.google.com/identity/sign-in/web/backend-auth

after a user successfully signs in, send the user's ID token to your server using HTTPS

我在向服务器发送每个请求时都会发送令牌:

endpoint/get?access_token=" + access_token

然后在服务器上我调用 https://www.googleapis.com/oauth2/v3/tokeninfo

所以我有一个令牌,每个请求都经过身份验证,但是在 tokeninfo 方法 returns false 工作 1 小时后,我需要重新-验证用户。

在我的代码中,我通过存储所有历史 access_tokens 来规避这一点,如果客户端使用旧令牌,我检查历史数据并使用 refresh_token (一个我的权限之一是授予离线访问权限)


是的,我很想知道:

访问令牌是短暂的,只能持续一个小时,这不是您可以延长的时间。

您需要做的是获取刷新令牌并获取新的访问令牌。

示例:

您将从初始请求中获得的 refresh_token 和 HTTP Post 发送到: 注意:grant_type=refresh_token

https://accounts.google.com/o/oauth2/token
client_id={ClientId}.apps.googleusercontent.com&client_secret={ClientSecret}&refresh_token=1/ffYmfI0sjR54Ft9oupubLzrJhD1hZS5tWQcyAvNECCA&grant_type=refresh_token

回应

{
"access_token" : "ya29.1.AADtN_XK16As2ZHlScqOxGtntIlevNcasMSPwGiE3pe5ANZfrmJTcsI3ZtAjv4sDrPDRnQ",
"token_type" : "Bearer",
"expires_in" : 3600
}

正如@DaImTo 指出的那样,您无法延长access_token 的寿命。您可以使用 refresh_token 获得一个新的,但通常如果您尝试做这个客户端并有一个服务器,您应该重新考虑您的方法。

听起来您在这里做了两个 "authentications" - 客户端针对服务器进行身份验证,服务器针对 Google 服务进行身份验证。现在,服务器应该持有刷新令牌 - 所以它总是可以根据 Google 重新验证。听起来您正在考虑如何在 auth_token 超时后针对服务器验证您的客户端。

一般来说,客户端不应该发送 access_token 到服务器,也不应该发送 refresh_token。它所做的是在第一次登录期间,客户端获得一个一次性代码(来自 Google),并将其交给服务器。服务器使用它与 Google 对话并获取 access_token 和 refresh_token,确认用户已通过身份验证,然后将某些内容(通常是 cookie)发送回客户端说 "ok, I've authenticated you. Here is how you keep authenticating yourself for the rest of our conversation."

后面的操作非常标准,与 oauth 本身无关。然后客户端和服务器像往常一样进行通信 - 根本不交换任何 oauth 内容,您依靠 cookie(或等效物)来保持客户端-服务器身份验证。服务器继续使用身份验证令牌和刷新令牌与 Google.

通信

https://developers.google.com/identity/sign-in/web/server-side-flow 我认为这是目前最好的指南。或者至少它是我目前能找到的最好的。至少它有一个很好的图表。

关键是您正在与服务器交换名称精美的 "code"(我称之为 "one-time code")。完成后,服务器会使用 Google 对您进行身份验证 - 然后它会获得 access/refresh 令牌,您无需传递这些令牌即可与服务器通信。