我有一个使用cordova-plugin-googleplus的cordova应用,允许用户使用他们的Google +帐户进行身份验证。该应用还允许用户访问S3存储桶以通过aws sdk上传照片。为了实现这一目标,我们使用的是AWS Cognito with federated identities,效果非常好。
问题是1小时后没有S3活动,我在下次应用尝试上传时开始收到此错误:
{
"__type": "NotAuthorizedException",
"message": "Invalid login token. Token expired: 1513206998 >= 1513197640"
}
根据我的research,问题是google +令牌即将到期,需要刷新,但我无法理解如何做到这一点。请注意,这需要在用户不知情的情况下在后台完成。要求用户每小时重新进行身份验证是不可接受的。
以下是登录代码:
window.plugins.googleplus.login(prams, obj => {
let authData = {
accessToken: obj.accessToken,
idToken: obj.idToken
};
localStorage.setItem('authData', authData);
});
然后我们是时候访问S3存储桶了:
let authData = localStorage.getItem('authData');
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'my-cognito-identity-pool-id',
Logins: { 'accounts.google.com': authData.idToken };
});
AWS.config.region = 'us-west-2;
AWS.config.credentials.getPromise()
.then(() => {
let s3 = new AWS.S3();
let params = {
Bucket: 'my-bucket',
Key: 'my-key',
Body: imageBytes,
ContentType: 'image/jpeg'
};
s3.upload(params);
});
我的理解是我需要查找上面列出的错误并刷新google +令牌(如果发生),但我不确定如何完成。我在cordova-plugin-googleplus
库中看不到对此的支持。我自己必须提出http请求吗?这是如何运作的?据推测,我需要在登录后保存刷新令牌并以某种方式使用它。
答案 0 :(得分:2)
根据this:
您需要获取oauth令牌并将其交换为正确 登录时的令牌(刷新/访问)
[...]
当用户需要刷新令牌时(60分钟后),您必须为其刷新。 Aka当您请求谷歌api服务并且它向您发回一个"令牌无效"时,您必须吃错误并刷新令牌并再次尝试原始请求。
如果使用oauth2/v4
端点仍有无效令牌,则可能必须使用oauth2/v1
端点:
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=...
您也可以查看google documentation,还可以找到一个php示例here。
答案 1 :(得分:0)
我可以使用trySilentLogin附带的cordova-plugin-googleplus方法来实现此功能。