我正在我的单页(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
。
您可以在此处找到更多信息。
基本上,它的工作原理是这样的:
- 用户连接到您的网站并点击"登录按钮">
- 您会收到 JavaScript 中的
access_token
和code
- 将此
code
发送到 Web 服务器上的 PHP 脚本 - 该脚本向 Google 服务器发出请求,并将您的
code
换成access_token
(应该与您刚刚在 JavaScript 中收到的相同(和一个refresh_token
- 您需要将此
refresh_token
存储在某个地方(在数据库中示例(,因为它只会发出一次(当用户授予许可( - 当您的某个
access_token
即将过期时,您可以使用您的refresh_token
获取另一个有效access_token
除了设置计时器外,您还应该在进行 API 调用之前检查您的令牌是否仍然有效。现在客户端库返回了 promise,并且 promise 是可链接的,您可以非常优雅地执行此操作。
在这里查看我的要点。