如何使用 auth0 jwt 识别用户
Posted
技术标签:
【中文标题】如何使用 auth0 jwt 识别用户【英文标题】:How to identify a user with auth0 jwt 【发布时间】:2016-11-15 20:55:18 【问题描述】:我有一个 angular2 前端,它使用 Auth0 进行身份验证,后端有一个 .net 核心应用程序。一切都在执行安全的 API 调用。
在后端识别经过身份验证的用户的最佳方法是什么?我能想到的一种相当笨拙的方法是公开一个允许我连接用户的“setUserToken”api调用ID 为以下任一:
令牌var bearerToken = Request.Headers["Authorization"].ToString()
社交 ID var socialId = User.Claims.Where(c => c.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier").First().Value
这样,通过后续的 API 调用,我可以简单地 findUserByToken()
或 findUserBySocialProviderOpenId()
我确定我错过了一个更明显的解决这个问题的方法。任何指导将不胜感激。
【问题讨论】:
【参考方案1】:JWT 的 sub
声明始终由 Auth0 生成,并将包含用户的标识符,与用于登录的身份提供者无关。
https://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#rfc.section.4.1.2
子(主体)声明标识作为 JWT 主体的主体。 JWT 中的声明通常是关于主题的陈述。主题值必须在发行者的上下文中限定为本地唯一或全局唯一。此声明的处理通常是特定于应用程序的。子值是包含 StringOrURI 值的区分大小写的字符串。使用此声明是可选的。
在大多数情况下,您的后端 API 应该只是 Auth0 访问令牌的使用者,不需要公开任何与身份验证相关的端点。
【讨论】:
感谢 Rodrigo 的回复 :) 事实上,我的子声明确实告诉了我身份提供者。所以(在上面的例子中)socialId == google-oauth2|[idNumber]
虽然,我的主要问题是如何在我的 API 中识别用户。
我不确定我是否遵循 - 您的 API 收到了 sub
声明,因此它可以让您识别用户是谁。还是您问的是更具体的实现问题?
这正是我正在寻找的 :) 所以在我的情况下,子声明是 google id。您是否将针对特定用户的子声明存储在数据库中?我最近来自 Java EE 背景,所以如果 .NET 有一些我缺少的聪明的替代方案,我不是 100%。
存储 ID 或拥有数据库并不是绝对必要的,因为 JWT 允许无状态身份验证(您可以信任令牌中的任何内容)。如果您确实需要在数据库中存储有关用户的更多信息,那么可以,您可以使用 sub
声明作为用户的唯一 ID。
好的,太棒了。这几乎可以解决问题。感谢您的宝贵时间。以上是关于如何使用 auth0 jwt 识别用户的主要内容,如果未能解决你的问题,请参考以下文章
如何安全地保存从 auth0 登录收到的 JWT 令牌(nodejs express)