首页 > 解决方案 > 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域的自动登录

在此处输入图像描述

标签: node.jsangularmongodbjwt

解决方案


我不会说它是自动登录。

但是,当您单击 时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,在两个域上都保存了登录信息。


推荐阅读