提问人:Jahanzaib 提问时间:6/17/2023 更新时间:6/19/2023 访问量:269
使用 REST API 中的令牌/cookie 建立浏览器会话
Establish browser session using token/cookie from REST API
问:
我正在尝试构建一个场景,其中前端应用程序(应用程序 A)调用另一个应用程序(应用程序 B)的 REST API 来验证用户身份。应用程序 B 为用户生成一个 tokenId,并在用户通过身份验证后在 REST API 响应中将其发送回
应用程序 A 现在希望利用此 tokenId 与应用程序 B 建立同一用户的浏览器会话,以便以后它应该能够在需要时将用户重定向到应用程序 B(无需再次提示输入用户名和密码,因为用户已通过 REST 进行身份验证)
应用程序 B 期望 tokenId 是标头的一部分,以便标识经过身份验证的用户并信任它已通过身份验证。
现在有两个问题:
- 从技术上讲,是否可以做到上述?如果是,我们如何在重定向时将 tokenID 从 REST API 的响应正文传递到浏览器以建立会话(我正在考虑创建隐藏表单并执行 POST 之类的操作,但不确定如何使用此设置将 tokenId 包含在标头中)
- 这种类型的设置/流程中是否存在任何安全问题?
请对上述内容进行指导,也欢迎提出建议和想法!
答:
我正在考虑一些事情,比如创建一个隐藏的表单并做一个 POST 但不确定如何将 tokenId 包含在标头中 设置
AFAIK,这是做不到的。不能以正常形式的 POST 设置标头。在表单帖子中设置标题的唯一方法是在 AJAX 调用中。
这是我的做法。
在应用程序 B 中创建一个 API 服务,该服务接受 tokenID 并返回应用程序 B 中要重定向到的页面的 URL。您可以将其包含在响应的标头中。我会像这样将查询字符串参数附加到此 URL。Location
https://appB.com/redirect/to/this/page?key=<one-time or time-bound JWT>
此 JWT 可以在其声明中包含一些可公开识别的信息,例如用户的 ID 或电子邮件地址。您可以通过包含时间戳并仅在 5 秒内使用时才认为它有效,从而使其成为一次性或有时间限制的。使用一次性或有时限的约束来限制此 JWT 应该就足够了,但这里有一些您可以遵循的更多安全最佳实践。sub
如果您不想使用 JWT,只需使用只有应用程序 A 和 B 知道的私钥来加密可公开识别的信息和时间戳。
然后在应用程序 A 中,应接收此响应,并使用标头中的 URL 进行重定向。Location
应用程序 B 中发生重定向的页面将读取此 JWT 并对其进行验证,然后为用户创建会话。如果您使用了自己的私钥加密,则将使用相同的私钥进行解密。
评论