node.js - Angular/ MongoDB/ NodeJs:从一个域自动登录到另一个域
问题描述
在我的应用程序中,我管理两个域;一个是http://localhost:4500
,另一个在http://localhost:4600
现在的情况是,当http://localhost:4500
使用这些凭据登录到域时,我还想创建一个实现,http://localhost:4600
在单击got-to-front-panel
已登录到 http://localhost:4500 域的特定用户的链接时自动登录到域.
对于http://localhost:4500
域,我有一个 Angular 应用程序,我通过externalUrl
路由过程进行了管理。
应用程序路由.module.ts
{
path: "go-to-front-panel",
canActivate: [RedirectGuard],
component: RedirectGuard,
data: {
externalUrl: "http://localhost:4600"
}
}
重定向-guard.service.ts
export class RedirectGuard implements CanActivate {
constructor(private router: Router) { }
canActivate({ data }: ActivatedRouteSnapshot): boolean {
window.open(data.externalUrl, '_blank');
return false;
}
}
登录http://localhost:4500
域时,它将以下 json 值存储到 mongodb 表中
{
"_id" : ObjectId("5fcb088781f14e2f783eq262"),
"userId" : 1,
"token" : "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImp0aSI6IjM4Njk4NWUyLTc5MTItNDZhMy04YjY5LWMxYTdhZDQ2OWRhMSIsImlhdCI6MTYwNzQxMDMxMSwiZXhwIjoxNjA3NDEzOTExfQ.0czxMiH7yblJWxIepzHbq7C8oVde01kFnKnScC54LW4",
"createdAt" : "2020-11-08 15:00:55",
"deactivatedAt" : null,
"__v" : 0
}
并在 sessionStorage 中存储该域的令牌值http://localhost:4500
登录组件.ts
sessionStorage.setItem('token', userDetails.token);
=> 令牌值是使用jwt.sign
以下方法生成的。
const token = jwt.sign({ userDetails }, SECRET_KEY);
=> 那么我该如何管理从http://localhost:4500
域到http://localhost:4600
域的自动登录
解决方案
我不会说它是自动登录。
但是,当您单击 时got-to-front-panel
,您可以尝试按照以下步骤操作。
(1) 获取一个 nonce 的后端。随机数将能够识别用户。您可以将 nonce 保存在 redis 中或在 5-10 秒后过期的东西中。
(2) 将 nonce 附加到 http://localhost:4600?/nonce=some-very-long-unique-string-like-uuid
(3) http://localhost:4600 使用 nonce 联系后端进行身份验证。后端使用身份验证令牌使 nonce 和响应过期。
(4) http://localhost:4600 获取认证令牌并保存到localstorage
此行为类似于您如何在 google/facebook 中进行身份验证并使用唯一代码重定向到您想要的 URL 以进行身份验证。
另一种方法在某种程度上类似。
(1) 用户登录http://localhost:4700,获取认证token
(2) 用户重定向到 http://localhost:4800/redirect-url/?token=sometoken
(3) 在 http://localhost:4800 通过将令牌保存在本地存储中或使用您自己的身份验证机制完成身份验证
(4) 重定向回http://localhost:4700
(5) viola,在两个域上都保存了登录信息。
推荐阅读
- node.js - AWS Lambda、NodeJS、pg-promise 库 - 高延迟 > 10000 毫秒
- racket - 在 Beginner Racket 中创建 Python 的 collections.counter() 方法
- swift - 如何在 IOS 14 swift 中显示下拉按钮菜单
- c# - AutoMapper - 试图将我的对象属性展平为字符串但出现错误
- msbuild - 如何使用 msbuild 从解决方案构建中排除项目?
- android - Android 应用程序在通过 Android Studio 安装时可以工作,但在通过 Google Play 安装和打开时会显示一些设置页面
- c++ - 程序执行后如何去掉最后一行的“Outstanding”?
- laravel - 是否可以通过不同的子域对用户进行身份验证?
- flutter - 添加新的依赖项之间的冲突
- python - 酷力 Python API 连接