Как восстановить токен с истекшим сроком действия?
Я использую AWS для своего веб-сайта. Через 1 час токен истекает, и пользователь почти ничего не может сделать.
пока я пытаюсь обновить учетные данные следующим образом:
function getTokens(session) {
return {
accessToken: session.getAccessToken().getJwtToken(),
idToken: session.getIdToken().getJwtToken(),
refreshToken: session.getRefreshToken().getToken()
};
};
function getCognitoIdentityCredentials(tokens) {
const loginInfo = {};
loginInfo[`cognito-idp.eu-central-1.amazonaws.com/eu-central-1_XXX`] = tokens.idToken;
const params = {
IdentityPoolId: AWSConfiguration.IdPoolId
Logins: loginInfo
};
return new AWS.CognitoIdentityCredentials(params);
};
if(AWS.config.credentials.needsRefresh()) {
clearInterval(messwerte_updaten);
cognitoUser.refreshSession(cognitoUser.signInUserSession.refreshToken, (err, session) => {
if (err) {
console.log(err);
}
else {
var tokens = getTokens(session);
AWS.config.credentials = getCognitoIdentityCredentials(tokens);
AWS.config.credentials.get(function (err) {
if (err) {
console.log(err);
}
else {
callLambda();
}
});
}
});
}
дело в том, что после 1 часа маркер входа обновляется без проблем, но после 2hrs я больше не могу обновлять маркер входа.
Я также попытался с помощью AWS.config.credentials.get()
, AWS.config.credentials.getCredentials()
и AWS.config.credentials.refresh()
что тоже не работает.
сообщения об ошибках, которые я получаю являются:
отсутствуют учетные данные в config
недопустимый маркер входа. Токен истек: 1446742058 > = 1446727732
3 ответов
обычно это решается путем перехвата http-запросов с дополнительной логикой.
function authenticationExpiryInterceptor() {
// check if token expired, if yes refresh
}
function authenticationHeadersInterceptor() {
// include headers, or no
}}
затем с использованием HTTPService layer
return HttpService.get(url, params, opts) {
return authenticationExpiryInterceptor(...)
.then((...) => authenticationHeadersInterceptor(...))
.then((...) => makeRequest(...))
}
Она может быть решена по доверенности, а также http://2ality.com/2015/10/intercepting-method-calls.html
в отношении AWS: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Credentials.html
вы заинтересованы в:
- getPromise()
- refreshPromise()
вот как я реализовал это:
сначала вам нужно авторизовать пользователя на сервис и предоставить разрешения:
пример запроса:
вот как я реализовал это:
сначала вам нужно авторизовать пользователя на сервис и предоставить разрешения:
пример запроса:
POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token&
Content-Type='application/x-www-form-urlencoded'&
Authorization=Basic aSdxd892iujendek328uedj
grant_type=authorization_code&
client_id={your client_id}
code=AUTHORIZATION_CODE&
redirect_uri={your rediect uri}
это вернет Json что-то вроде:
HTTP / 1.1 200 ЛАДНО Тип контента: application / json
{"access_token":"eyJz9sdfsdfsdfsd", "refresh_token":"dn43ud8uj32nk2je","id_token":"dmcxd329ujdmkemkd349r", "token_type":"Bearer", "expires_in":3600}
теперь вам нужно получить маркер доступа в зависимости от вашей области:
POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token
Content-Type='application/x-www-form-urlencoded'&
Authorization=Basic aSdxd892iujendek328uedj
grant_type=client_credentials&
scope={resourceServerIdentifier1}/{scope1} {resourceServerIdentifier2}/{scope2}
Json будет:
HTTP / 1.1 200 OK Тип контента: application / json
{"access_token":"eyJz9sdfsdfsdfsd", "token_type":"Bearer", "expires_in":3600}
теперь этот маркер доступа действителен только для 3600 секунд, после чего вам нужно обменять, чтобы получить новый маркер доступа. Для этого
чтобы получить новый токен доступа из обновления Токен:
POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token >
Content-Type='application/x-www-form-urlencoded'
Authorization=Basic aSdxd892iujendek328uedj
grant_type=refresh_token&
client_id={client_id}
refresh_token=REFRESH_TOKEN
ответ:
HTTP / 1.1 200 OK Тип контента: application / json
{"access_token":"eyJz9sdfsdfsdfsd", "refresh_token":"dn43ud8uj32nk2je", "id_token":"dmcxd329ujdmkemkd349r","token_type":"Bearer", "expires_in":3600}
вы получите картину правильно.
Если вам нужно больше деталей иди сюда.
после почти 2 недель, я наконец решил он.
вам нужен токен обновления, чтобы получить новый токен Id. После получения обновленного токена обновите AWS.конфиг.объект учетных данных с новым токеном Id.
вот пример того, как настроить это, работает гладко!
refresh_token = session.getRefreshToken(); // you'll get session from calling cognitoUser.getSession()
if (AWS.config.credentials.needsRefresh()) {
cognitoUser.refreshSession(refresh_token, (err, session) => {
if(err) {
console.log(err);
}
else {
AWS.config.credentials.params.Logins['cognito-idp.<YOUR-REGION>.amazonaws.com/<YOUR_USER_POOL_ID>'] = session.getIdToken().getJwtToken();
AWS.config.credentials.refresh((err)=> {
if(err) {
console.log(err);
}
else{
console.log("TOKEN SUCCESSFULLY UPDATED");
}
});
}
});
}