I'm using AWS for my website. After 1 hour the token expires and the user pretty much can't do anything.
For now i'm trying to refresh the credentials like this:
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(); } }); } }); }
the thing is, after 1hour, the login token gets refreshed without a problem, but after 2hrs i can't refresh the login token anymore.
i also tried using AWS.config.credentials.get()
, AWS.config.credentials.getCredentials()
and AWS.config.credentials.refresh()
which doesn't work either.
The error messages i'm getting are:
Missing credentials in config
Invalid login token. Token expired: 1446742058 >= 1446727732
2 Answers
Answers 1
Usually it's solved by intercepting http requests with additional logic.
function authenticationExpiryInterceptor() { // check if token expired, if yes refresh } function authenticationHeadersInterceptor() { // include headers, or no }}
then with use of HttpService layer
return HttpService.get(url, params, opts) { return authenticationExpiryInterceptor(...) .then((...) => authenticationHeadersInterceptor(...)) .then((...) => makeRequest(...)) }
It could be solved by proxy as well http://2ality.com/2015/10/intercepting-method-calls.html
In relation to AWS: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Credentials.html
You're interested in:
- getPromise()
- refreshPromise()
Answers 2
Here is how I implemented this:
First you need to authorize the user to the service and grant permissions:
Sample request:
Here is how I implemented this:
First you need to authorize the user to the service and grant permissions:
Sample request:
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}
This will return a Json something like:
HTTP/1.1 200 OK Content-Type: application/json
{"access_token":"eyJz9sdfsdfsdfsd", "refresh_token":"dn43ud8uj32nk2je","id_token":"dmcxd329ujdmkemkd349r", "token_type":"Bearer", "expires_in":3600}
Now you need to get an access token depending on your scope:
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 would be:
HTTP/1.1 200 OK Content-Type: application/json
{"access_token":"eyJz9sdfsdfsdfsd", "token_type":"Bearer", "expires_in":3600}
Now this access_token is only valid for 3600 secs, after which you need to exchange this to get a new access token. To do this,
To get new access token from refresh Token:
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
Response:
HTTP/1.1 200 OK Content-Type: application/json
{"access_token":"eyJz9sdfsdfsdfsd", "refresh_token":"dn43ud8uj32nk2je", "id_token":"dmcxd329ujdmkemkd349r","token_type":"Bearer", "expires_in":3600}
You get the picture right.
If you need more details go here.
0 comments:
Post a Comment