我有一个包含多个微服务的Web应用程序(node.js)
它有一个存储在数据库中的内部用户群。
当用户想要使用oAuth登录时,我们在OpenID令牌中获取用户名,并将其与数据库中的用户名进行匹配以获取userID。
我是否应该将userID存储在cookie中,以便它可用于所有微服务,并以某种方式使用我的应用程序将生成的内部令牌来验证它,该令牌也将存储在cookie中并单独验证访问令牌?意味着2次确认。
或者我应该再次从访问令牌中提取用户名,再次将其与数据库匹配,获取用户ID并在第一次访问每个微服务时将其存储在每个微服务的会话中?
我知道这两种方法都有效,我问的是使用应用内用户群时的最佳实践。
2条答案
按热度按时间2eafrhcq1#
推荐的方法是创建一个会话ID,将其保存在cookie中,然后在服务器上创建一个DB条目,将会话ID与用户数据相匹配。
然后,当浏览器与服务器通信时,查找会话ID并获取相关的用户信息。您还可以将访问令牌与会话ID相关联。
https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html#session-management-implementation:~:text= The%20mean%20and,internal%20session%20details.
所以,回答你的问题。两者皆是。您使用Cookie,但用于存储会话ID,而不是用户ID。您确实将其与数据库进行匹配,但您将会话ID与会话对象(即包含您收到的任何信息和您的应用程序需要的对象)进行匹配。
如果OIDC提供者支持会话管理,OIDC规范也有一些关于会话的信息。但是,这更多的是关于用户是否登录。这取决于您的应用程序,以及拥有用户名是否意味着用户必须登录。
https://openid.net/specs/openid-connect-session-1_0.html#CreatingUpdatingSessions:~:text= In%20OpenID%20Connect,Authentication%20Error%20响应。
k5ifujac2#
最好是只有一个API网关微服务-这样你的前端只与网关通信,没有其他微服务处理前端身份验证/授权。
如果你已经有了OAuth2令牌,我认为没有必要引入cookie--只需在每个请求中向你的微服务发送一个OAuth2令牌。Cookie带来了新的安全问题,并且不可能使用不同的身份打开多个浏览器选项卡(它们共享相同的Cookie)。而且很难执行注销(从所有微服务中删除所有Cookie)。但如果您愿意,也可以使用它们(使用分布式会话存储)。
不要生成自己的令牌-您将创建自己的安全协议,这将有自己的安全问题。