如何使用 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 令牌用户基于角色的授权

通过 Express / Auth0 后端登录用户

如何安全地保存从 auth0 登录收到的 JWT 令牌(nodejs express)

如何使用 auth0-js WebAuth 识别新用户?

如何查看存储在 JWT 中的数据?使用 auth0 和 express-jwt

如何在Redux中使用Auth0 JWT访问API?