我在我的网站上使用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小时后,登录令牌会毫无问题地刷新,但在2小时后我就不能再刷新登录令牌了。
我还尝试使用AWS.config.credentials.get()
,AWS.config.credentials.getCredentials()
和AWS.config.credentials.refresh()
哪个也不起作用。
我得到的错误信息是:
配置中缺少凭据
无效的登录令牌。令牌已过期:1446742058> = 1446727732
答案 0 :(得分:5)
通常通过使用附加逻辑拦截http请求来解决。
function authenticationExpiryInterceptor() {
// check if token expired, if yes refresh
}
function authenticationHeadersInterceptor() {
// include headers, or no
}}
然后使用HttpService层
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
您对以下内容感兴趣:
答案 1 :(得分:3)
差不多两个星期后,我终于解决了它。
您需要刷新令牌才能接收新的Id令牌。获取刷新令牌后,使用新的Id令牌更新AWS.config.credentials对象。
这里有一个关于如何设置它,运行顺利的例子!
java.util.Date tempDate = issueDate.toGregorianCalendar().getTime();
答案 2 :(得分:2)
以下是我实施此方法的方法:
首先,您需要授权用户使用该服务并授予权限:
示例请求
以下是我实施此方法的方法:
首先,您需要授权用户使用该服务并授予权限:
示例请求
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好的 Content-Type: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}
杰森将是:
HTTP / 1.1 200好的 Content-Type:application / json
{"access_token":"eyJz9sdfsdfsdfsd", "token_type":"Bearer", "expires_in":3600}
现在,此access_token仅在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好的 Content-Type:application / json
{"access_token":"eyJz9sdfsdfsdfsd", "refresh_token":"dn43ud8uj32nk2je", "id_token":"dmcxd329ujdmkemkd349r","token_type":"Bearer", "expires_in":3600}
你说得对。
如果您需要更多详情go here。
答案 3 :(得分:0)
这是使用AWS Amplify库刷新访问令牌的方式:
import Amplify, { Auth } from "aws-amplify";
Amplify.configure({
Auth: {
userPoolId: <USER_POOL_ID>,
userPoolWebClientId: <USER_POOL_WEB_CLIENT_ID>
}
});
try {
const currentUser = await Auth.currentAuthenticatedUser();
const currentSession = currentUser.signInUserSession;
currentUser.refreshSession(currentSession.refreshToken, (err, session) => {
// do something with the new session
});
} catch (e) {
// whatever
}
};
此处有更多讨论:https://github.com/aws-amplify/amplify-js/issues/2560。