Как обновить токен google+ auth для доступа к S3

У меня есть приложение cordova, которое использует https://github.com/EddyVerbruggen/cordova-plugin-googleplus, чтобы пользователи могли проходить аутентификацию в своей учетной записи google+. Приложение также дает пользователю доступ к корзине S3 для загрузки фотографий через AWS SDK. Для этого мы используем AWS Cognito с федеративными удостоверениями, который работает довольно хорошо.

Проблема в том, что после 1 часа неактивности S3, я начинаю получать эту ошибку в следующий раз, когда приложение пытается выполнить загрузку:

{
    "__type": "NotAuthorizedException",
    "message": "Invalid login token. Token expired: 1513206998 >= 1513197640"
}

Судя по моим исследованиям, проблема в том, что токен 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 ответа

Решение

Мне удалось заставить это работать, используя метод trySilentLogin, который поставляется с https://github.com/EddyVerbruggen/cordova-plugin-googleplus.

Согласно этому:

Вам необходимо взять токен oauth и обменять его на правильные токены (обновить / получить доступ) при входе в систему.

[...]

Когда пользователю необходимо обновить свой токен (через 60 минут), вы должны обновить его для него. Ака, когда вы запрашиваете сервис API Google и отправляет вам обратно "токен недействителен", вы должны устранить ошибку, обновить токен и повторить исходный запрос.

Если у вас все еще есть недействительный токен, использующий oauth2/v4 конечная точка, возможно, вам придется использовать oauth2/v1 конечная точка:

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=...

Вы также можете взглянуть на документацию Google, а также найти пример php здесь.

Другие вопросы по тегам