如何刷新用于S3访问的Google +身份验证令牌

时间:2018-01-11 20:09:42

标签: cordova token google-plus aws-sdk aws-cognito

我有一个使用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请求吗?这是如何运作的?据推测,我需要在登录后保存刷新令牌并以某种方式使用它。

2 个答案:

答案 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方法来实现此功能。