3

我在我的单页 (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"

}
4

2 回答 2

2

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

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

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

  1. 用户连接到您的网站并点击“登录按钮”
  2. 你在 JavaScript 中收到一个access_token 和一个code
  3. 您将其发送code到 Web 服务器上的 PHP 脚本
  4. 该脚本向 Google 服务器发出请求并将您的交换code为一个 access_token(应该与您刚刚在 JavaScript 中收到的相同)和一个refresh_token
  5. 您需要将其存储在refresh_token某处(例如在数据库中),因为它只会发布一次(当用户授予权限时)
  6. 当你的一个access_token即将到期时,你可以用你的 refresh_token来获得另一个有效的access_token
于 2014-05-22T11:30:26.287 回答
0

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

在这里查看我的要点。

于 2015-05-11T18:36:20.863 回答