oauth 2.0 - 如何刷新 google plus 持有者令牌 (javascript)



我正在我的单页(javascript(应用程序中使用Google HTML登录按钮从具有Google登录名的用户那里获取授权对象。详见:https://developers.google.com/+/web/signin/add-button。

我成功收到如下所示的令牌。由于此令牌将在 1 小时后过期,因此我需要每 30 分钟左右刷新一次令牌,直到用户选择注销。我正在尝试通过调用:

gapi.auth.authorize({client_id: "90... ...92.apps.googleusercontent.com", scope: "profile email", immediate: true}, function() { console.log( arguments ); } );

但没有运气。我收到相同的令牌,直到它过期,之后我得到空的(未登录的(令牌。如何在用户无需持续再次登录的情况下保留/刷新持有者令牌?

{
    _aa: "1"
    access_token: "ya29.1.AA... ...BByHpg"
    authuser: "0"
    client_id: "90... ...92.apps.googleusercontent.com"
    code: "4/Nyj-4sVVcekiDnIgMFh14U7-QdRm.svPMQSODiXMbYKs_1NgQtmX9F90miwI"
    cookie_policy: "single_host_origin",
    expires_at: "1398341363",
    expires_in: "3600",
    g_user_cookie_policy: undefined,
    id_token: "eyJhbGciOiJ... ...0Es1LI"
    issued_at: "1398337763",
    num_sessions: "2",
    prompt: "none",
    response_type: "code token id_token gsession",
    scope: "https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email",
    session_state: "b92d67080... ...73ae",
    state: "",
    status: {
       google_logged_in: true,
       method: "AUTO",
       signed_in: true
    },
    token_type: "Bearer"
}

使用客户端流(即 Java 脚本(只能接收短暂(~1 小时(access_token。如果您希望能够刷新它,则需要一个只能使用服务器端流获取的refresh_token

您可以在此处找到更多信息。

基本上,它的工作原理是这样的:

  1. 用户连接到您的网站并点击"登录按钮">
  2. 您会收到 JavaScript 中的access_tokencode
  3. 将此code发送到 Web 服务器上的 PHP 脚本
  4. 该脚本向 Google 服务器发出请求,并将您的code换成 access_token(应该与您刚刚在 JavaScript 中收到的相同(和一个refresh_token
  5. 您需要将此refresh_token存储在某个地方(在数据库中示例(,因为它只会发出一次(当用户授予许可(
  6. 当您的某个access_token即将过期时,您可以使用您的 refresh_token获取另一个有效access_token

除了设置计时器外,您还应该在进行 API 调用之前检查您的令牌是否仍然有效。现在客户端库返回了 promise,并且 promise 是可链接的,您可以非常优雅地执行此操作。

在这里查看我的要点。

最新更新