Как обновить токен 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 здесь.