【发布时间】:2022-02-10 23:47:00
【问题描述】:
我正在开发一个简单的网络应用程序,用于学习目的,前端使用 Angular,后端使用 Java Spring。我没有希望你们帮助我解决的特定问题,而是有一个关于 OAuth2 身份验证的问题。
我已经在 Azure AD(授权代码流 + PKCE)中注册了我的 Angular SPA,我设置了角色并且一切正常。我的问题是当经过身份验证的用户 ping 我的后端时我该怎么办?我的后端没有关于用户的信息。
我想到了一个制作网络过滤器的解决方案,每次经过身份验证的用户 ping 任何需要用户身份验证的端点时,检查数据库是否用户存在(通过用户名),如果存在则保存他不存在。我很确定这会起作用,但我认为这不是最好的解决方案,考虑到我的网络过滤器必须从数据库中读取每个传入的 HTTP 请求,并偶尔写入数据库(如果用户首次登录)。
我不应该担心性能问题,因为我完全出于学习目的而构建它,但是我想以正确的方式做到这一点。我尝试以多种方式进行谷歌搜索,但我想我没有使用正确的关键字来查找我正在寻找的内容。任何意见或建议将不胜感激!谢谢!
编辑:我按照这篇文章实现了OAuth2 + OIDC的认证和授权,我在后端的安全配置是一样的:https://ordina-jworks.github.io/security/2020/08/18/Securing-Applications-Azure-AD.html
【问题讨论】:
-
请参考SO thread
-
您需要对后端和前端进行身份验证
-
使用 OAuth2(授权代码流 + PKCE),您应该获得需要发送到后端的访问令牌。使用您的后端,您不需要存储用户信息,但可以使用另一个 API 来验证用户令牌是否有效,即使用令牌调用 userinfo_endpoint 以查看它是否仍然有效。比如
GET /oidc/userinfo HTTP/1.1 Host: graph.microsoft.com Authorization: Bearer <access token>——这是你要找的吗? -
@Aleksandar 那是你使用缓存的地方。您可以做的是,实现一个自定义 Web 过滤器,该过滤器可以侦听传入的 HTTP 请求、检查有效的访问令牌、获取用户详细信息并检查您的缓存(如果用户存在)。如果没有,则在数据库中创建一个条目,然后将其保存到缓存中。您可以实现一个简单的
CacheService并在自定义网络过滤器中调用它来检查用户是否可用(如stackoverflow.com/a/27091020/308565)。此缓存可以在应用启动时从用户的数据库表中预填充。 -
@NagarajTantri 我认为这肯定会解决我的问题(这是一个很好的学习解决方案)。您介意将其发布为答案以便我接受吗?
标签: java angular azure oauth-2.0 jwt