amazon-cognito - 手动设置 aws-amplify 用户会话
问题描述
我有一个被多个应用程序使用的认知用户池。我有一个中央身份验证应用程序,用户可以在其中登录/注册/resetPasswords/等任何与身份验证相关的内容。
我还有其他五个用户可以访问的应用程序。我没有让他们登录到每个应用程序,而是将 auth 应用程序嵌入到 iframe 中。如果用户已登录,它会对父文档执行 postMessage,或者如果用户登录后令牌无效,它将使用 cognito session 对象执行 postMessage。
是否可以在父文档中完成诸如 Auth.setUserSession(session) 之类的事情?现在我必须用令牌和用户名值构建一堆字符串,并将它们手动保存到 localStorage。
我一直在查看 aws-amplify 身份验证代码,但我没有看到任何可以完成此操作的东西。
谢谢。
在父文档中:
const eventMethod = window.addEventListener ? 'addEventListener' : 'attachEvent';
const eventListener = window[eventMethod];
const messageEvent = eventMethod === 'attachEvent' ? 'onmessage' : 'message';
eventListener(messageEvent, async evt => {
const session = _.get(evt, 'data.session');
if (session) {
this.saveUserSession(session);
}
}, false);
private saveUserSession(session) {
// this is the code that I would like to simplify with something
// Auth.setUserSession(session)
const cognitoClientId = environment.COGNITO.Auth.userPoolWebClientId;
const userName = _.get(session, 'idToken.payload.email', '');
const makeKey = (name) => `CognitoIdentityServiceProvider.${cognitoClientId}.${userName}.${name}`;
localStorage.setItem(makeKey('accessToken'), JSON.stringify(_.get(session, 'accessToken', '')));
localStorage.setItem(makeKey('idToken'), JSON.stringify(_.get(session, 'idToken', '')));
localStorage.setItem(makeKey('refreshToken'), JSON.stringify(_.get(session, 'refreshToken', '')));
localStorage.setItem(makeKey('clockDrift'), JSON.stringify(_.get(session, 'clockDrift', '')));
localStorage.setItem(`CognitoIdentityServiceProvider.${cognitoClientId}.LastAuthUser`, userName);
}
In the auth application, after a user successfully logs in:
const session = await Auth.currentSession();
window.parent.postMessage({session}, '*');
解决方案
您可以使用amazon-cognito-identity-jssetSignInUserSession
通过向方法提供 cognito 用户会话来设置用户会话
const userPool = new CognitoUserPool({
UserPoolId: `USER_POOL_ID`,
ClientId: `APP_CLIENT_ID`,
});
const cognitoIdToken = new CognitoIdToken({
IdToken: idToken,
});
const cognitoAccessToken = new CognitoAccessToken({
AccessToken: accessToken,
});
const cognitoRefreshToken = new CognitoRefreshToken({
RefreshToken: refreshToken,
});
const username = cognitoIdToken.payload.Username; // or what you use as username, e.g. email
const user = new CognitoUser({
Username: username,
Pool: userPool,
});
user.setSignInUserSession(new CognitoUserSession({
AccessToken: cognitoAccessToken,
IdToken: cognitoIdToken,
RefreshToken: cognitoRefreshToken,
}));
推荐阅读
- javascript - 为什么 API 数据显示在本地主机而不是发布站点?
- c++ - 为 char 数组适配 zlib zpipe
- python - pandas.loc 计算中的错误 - 切片数据帧的副本
- c# - 如何在 DataSourceProvider 中获取基础数据 - C#
- css - 字体大小与变换比例 - 有什么区别?
- vue.js - 为什么我在 Netlify 上的 Nuxt 站点部署失败并出现致命错误:未找到模块?
- visual-studio - CLion 相当于 Visual Studio C++“过滤器”
- ios - 如何在堆栈视图中设置按钮的宽度
- c# - ProjectInstaller 安装的 WCF Windows 服务无法处理 POST 请求
- go - goroutine 之间的 time.Sleep() 阻塞下一个 goroutine