【问题标题】:Mobile app authentication using Token based on OAuth2.0基于OAuth2.0使用Token的移动应用认证
【发布时间】:2021-04-05 20:28:23
【问题描述】:

我正在使用 Elixir 的 Phoenix 框架构建一个 REST API。在 API 中,我需要通过电话号码(即通过发送 SMS OTP 代码)对用户进行身份验证。在对用户进行身份验证后,身份验证服务器将访问令牌和刷新令牌发送给客户端。客户端(移动应用程序)将这些令牌存储在本地,并在对资源服务器的每个请求中将访问令牌作为 Authorization: Bearer <Access_Token> 发送到 HTTP 标头中。我的实际问题是,资源服务器如何验证从移动应用/客户端收到的访问令牌?

资源服务器是否需要联系身份验证服务器来验证访问令牌?那将是很多开销。请帮助我了解 RestFull API 身份验证。

感谢您花时间阅读我的问题。

【问题讨论】:

  • 你知道,您并不需要使用不记名令牌来保护网络服务。我个人不是不记名令牌的粉丝,因为您只能在安全的通信渠道中安全地使用它们。您是否考虑过使用签名请求?
  • 此外,身份验证方案与 REST 关系不大,反之亦然。 REST 是具有特定狭义技术和理论定义的特定技术术语,涉及如何通过给定传输表示和管理应用程序状态 - 您可以将承载令牌与非 RE​​ST Web 服务一起使用,并且您 可以将有状态的身份验证系统与其他无状态的 REST Web 服务一起使用。
  • 到目前为止我还没有听说过签名请求,请您告诉我更多有关它的信息,或者博客/链接真的会有所帮助。
  • 对于 OAuth 的签名请求功能,没有比 RFC 草案更规范的了:tools.ietf.org/html/draft-ietf-oauth-signed-http-request-03 - 尽管签名请求的概念可以追溯到至少 (现已弃用)HTTP Digest 身份验证方案。虽然我确信还有其他使用签名事务进行身份验证的方案早于 HTTP(一个很好的例子是 US EAM system,它证明了 分布式分散式 认证系统)。
  • 从历史上看,需要现有 信任关系签名消息 概念可以追溯到几个世纪前because that's how the banking systems of the world worked in medieval times

标签: rest elixir phoenix-framework


【解决方案1】:

资源服务器如何验证从移动应用/客户端接收到的访问令牌?

夜总会保镖验证您的驾驶执照作为年龄证明以让您进入的方式相同:通过验证授权和签名,但不需要致电您的 DMV 来验证您的执照是真实的,因为它信任签名(在本例中为加密签名)。

也就是说,某些系统确实使用“参考标记”,这些标记很短(比如 32 个字节)无意义的随机数据,它们被用作某些系统的不可预测的记录标识符授权服务器持有的用户权限记录。资源服务器最初需要联系身份验证服务器,但随后它可以简单地将身份验证结果本身缓存一段时间。

【讨论】:

  • 感谢您的comment,它确实让我的困惑有所启发。但是传统移动应用程序的身份验证如何在没有承载令牌的情况下工作。您能否分享一个解释该过程的 URL(一个示例)。我对后端的东西有点陌生,我更像是一个前端人员,现在做后端工作。
  • @Rick 我敢打赌,当今大多数(非 SOAP)Web 服务使用分布式身份模型确实使用不记名令牌,因为它简单明了,而且很好——已建立(OAuth2/OIDC 主要是内置的不记名令牌)。
  • 我不能“给你一个 URL”,因为“AuthX”(“身份验证和授权”的缩写)是一个巨大的主题,我花了好几年才完全理解。
  • 好的,让我们暂时忘记承载令牌。使用电话号码(短信 otp 代码)进行移动应用身份验证的最佳解决方案是什么。
  • @Rick 我根本不会使用电话号码或短信,这是不安全的,并且实际上并没有证明或建立任何类型的可信赖身份验证方案所需的任何东西(它只是“证明”某人能够访问某人的电话或数分钟)。如果您能解释您的网络服务实际做了什么,或者为什么您认为需要使用某种形式的电话号码或基于 SMS 的身份验证系统,那将会有所帮助。你的用户是谁?他们想要完成什么?实际的安全要求是什么?
【解决方案2】:

听起来您已经准备好验证令牌。您将需要签署令牌的服务器的公钥。这取决于您正在使用的身份验证服务器如何获得它。在某些情况下,您可以将此密钥作为配置设置预加载到后端。否则,您可能可以通过对身份验证服务器的 https 请求获取它。这些天来,大多数身份验证服务器都希望提供一个 JWKS api,您可以使用它来获取所需的密钥。然后使用令牌和公钥,您可以使用您的 elixir jwt 库来验证您拥有的令牌是否由您信任的服务器签名,这意味着 SMS 代码已经过验证,您可以继续处理后端需要处理的任何内容请求。

如果您将 Joken 用于长生不老药,您可以查看 https://hexdocs.pm/joken_jwks/introduction.htmlhttps://hexdocs.pm/joken/introduction.html 了解更多信息。

【讨论】:

  • 我可以尝试使用mix phx.gen.secret 生成密钥并将密钥存储在身份验证服务器和资源服务器上以进行验证。即,在身份验证服务器上使用该密钥签署令牌并验证访问权限资源服务器上的令牌?
  • 嗯,不,您需要不同类型的密钥。您是否正在实施 Auth 服务器?使用 keycloak 或 identityserver4 等现成的 idp 可能会更好
  • 是的,我正在为我的需要实现自定义身份验证服务器,这就是为什么它需要很长时间:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多