我正在处理以下问题。
我有一个 ReactJs 项目,它运行到 Google AppEngine。
我有一个类,允许系统使用 OAuth2 令牌访问 Google 服务(例如 BigQuery、Drive、GMail...)。我使用 Google Identity Service 连接到 Google 服务。我没有在ReactJs中使用gapi或任何其他谷歌库。
不幸的是,令牌在一小时后过期,我希望它能被刷新。
在我的index.html中我有这个脚本
<script src="https://accounts.google.com/gsi/client" async defer></script>
我可以初始化用户以获取信息(电子邮件、图片、姓名......)
async function init(setUserConnected) {
const google = window.google;
google.accounts.id.initialize({
client_id: CLIENT_ID,
callback: (response) => {
const userObject = jwt_decode(response.credential);
let userConnected = userObject;
userConnected.ldap = userConnected.email.replace("@google.com", "");
setUserConnected(userConnected);
new Storage().setJson("userLogged", userConnected);
},
});
}
我可以获得使用 Google 服务的令牌
async function getToken(setAccessToken) {
const google = window.google;
return await google.accounts.oauth2.initTokenClient({
client_id: CLIENT_ID,
scope: SCOPES,
callback: (tokenResponse) => {
tokenResponse.creationDate = new Date();
new Storage().setJson("accessToken", tokenResponse);
setAccessToken(tokenResponse);
},
}).requestAccessToken();
}
获取刷新令牌有什么帮助吗?
非常感谢。
我想知道如何获取刷新令牌,以便令牌自动更新,而不要求用户注销并再次登录。
客户端库似乎无法实现这一点。 Google 需要安全存储(例如后端)来获取刷新令牌。因此,如果您想仅使用客户端并且需要新令牌,则必须使用
requestAccessToken()
方法,该方法将触发 Google 身份验证弹出窗口。
这里有一些很好的(尽管隐藏得很好)文档,可能对您有用:
来自使用代币模型-代币过期:
根据设计,访问令牌的生命周期很短。如果访问令牌在用户会话结束之前过期,请通过从用户驱动事件(例如按下按钮)调用 requestAccessToken() 来获取新令牌。
是的,不幸的是,这意味着用户每次需要新令牌时都必须单击按钮并浏览同意弹出窗口。来自同一个文档:
使用 requestAccessToken() 方法触发令牌 UX 流程并获取访问令牌。