当前位置: 首页 > 知识库问答 >
问题:

OAuth2密码授予与OpenID连接

齐浩淼
2023-03-14

我一直在广泛阅读有关OAuth和OpenID Connect的内容,但此问题专门涉及OAuth2资源所有者密码授予(又名OAuth2资源所有者凭据授予,又名OAuth2密码授予)

某些资源(例如Justin Richer的《OAuth2 in Action》一书)说不要使用OAuth2资源所有者密码授予进行身份验证-请参阅书中的第6.1.3节。

以下其他好资源都说我们可以使用OAuth2资源所有者密码授予来通过受信任的应用程序对用户进行本质上的身份验证:

  1. https://www.oauth.com/oauth2-servers/access-tokens/password-grant/
  2. https://stormpath.com/blog/the-ultimate-guide-to-mobile-api-security
  3. https://www.youtube.com/watch?v=FNz0Lupp8HM

但是我很难理解为什么我们不应该使用OAuth2资源所有者密码授权作为成功身份验证的基本证明?

我对资源所有者密码授予流的理解是,最终用户向受信任的客户端(我的本机应用程序)提供用户名和密码,然后客户端将其转发到我的API的OAuth服务器,并将其交换为访问令牌(和可选的刷新令牌),该令牌可用于其余经过身份验证的APIendpoint。本机应用程序不保存用户名/密码,而是依赖于短期访问令牌和长期刷新令牌(在到期时获取新的访问令牌)。

为什么我甚至需要OpenID连接?为什么我不能使用OAuth2资源所有者密码授权作为身份验证机制?

本机应用程序和API都是由同一个人(我)开发的。

欢迎任何解释。非常感谢。

共有3个答案

凌和悦
2023-03-14

OAuth 2.0,无论授予类型如何,都不是身份验证协议。

OpenID Connect是构建在OAuth 2.0之上的身份验证协议

以下是一些参考资料(其中一些来自编写OAuth 2.0和/或OpenID Connect的人):

  • http://www.thread-safe.com/2012/01/problem-with-oauth-for-authentication.html
  • https://twitter.com/ve7jtb/status/740650395735871488
  • https://nat.sakimura.org/2013/07/05/identity-authentication-oauth-openid-connect/

    http://ldapwiki.com/wiki/OAuth2.0不是一个身份验证协议
黎奇略
2023-03-14

资源所有者凭据授予的风险高于任何其他授予,并且违背了协议的目的,该协议旨在向客户端应用程序隐藏用户凭据。

在本机应用程序的情况下,您是对的,可以分析您的应用程序并从中检索消费者密钥。此外,我可以想象有人创建了一个类似于您的应用程序,并从中提取用户密码,并在用户未察觉的情况下执行其他潜在的恶意操作。

我建议您阅读OAuth2和OpenID Connect的规范。为什么不应该使用资源所有者密码授权(来自OAuth2规范):

资源所有者密码凭据授予类型通常用于遗留或迁移原因。它降低了客户端存储用户名和密码的总体风险,但不消除向客户端公开高权限凭据的需要。

这种授权类型比其他授权类型具有更高的风险,因为它维护了该协议试图避免的密码反模式。客户端可能会滥用密码,或者密码可能会无意中泄露给攻击者(例如,通过客户端保存的日志文件或其他记录)。

此外,由于资源所有者无法控制授权过程(资源所有者的参与在将其凭据移交给客户端时结束),因此客户端可以获得比资源所有者所需范围更广泛的访问令牌。授权服务器应考虑通过此授权类型颁发的访问令牌的范围和生命周期

授权服务器和客户端应尽量减少此授权类型的使用,并尽可能使用其他授权类型。

盖马鲁
2023-03-14

如果服务器和客户端应用程序都是您的,则可以使用资源所有者密码凭据流来获取访问令牌。

如果服务器是您的,但客户端应用程序不是您的(=如果客户端应用程序是由第三方供应商开发的),则服务器不应允许客户端应用程序使用资源所有者密码凭据流。这是因为资源所有者密码凭据流无法阻止第三方客户端应用程序窃取最终用户的密码。

OpenID Connect的规范没有描述OpenID提供者应如何对最终用户进行身份验证。相反,该规范描述了OpenID提供者应如何生成ID令牌。由于ID令牌包含OpenID提供者生成的签名,因此接收ID令牌的客户端应用程序可以验证ID令牌是否已由OpenID提供者真正签名。

也就是说,OpenID Connect是关于如何使最终用户身份验证的结果可验证的规范。它不是关于如何验证最终用户的规范。

 类似资料:
  • 关于使用OAuth2的spring-cloud-security我有两个问题: > 如何通过grant_type保护资源?我想用client_credentials保护我的REST API,然后通过密码授权类型保护用户特定的资源。这可能吗? 与本教程相一致的是,密码授予类型不需要客户端秘密,尽管spring cloud oauth2似乎总是需要客户端秘密。我怎么处理这个?通过设置一个像“ABC”这

  • 应用程序需要连接到仅支持OAuth2资源所有者密码凭据授予的API。我尝试使用下面的代码,但得到的响应代码为400“错误请求”。使用相同的代码,我可以连接到一个正常的网站并检索内容。 我知道API代码是工作,因为使用邮递员工作。在邮递员中,我只是发出一个帖子请求,提供用户名、密码和grant_type,并使用x-www. form-urlencoded 连接的返回是一个json。 你知道怎么了吗?

  • null 用户在登录表单中输入凭据->应用程序1将使用用户凭据从应用程序2获取令牌,其具有密码授予类型->使用令牌访问应用程序1的资源。 问题是Spring Security 5是否支持客户端的密码授予类型?我在Spring Security 5实现中找到了所有rest授予类型,但没有找到密码。

  • 问题内容: 我正在使用一组受oAuth2保护的服务。当前它是这样工作的:客户端使用其用户名和密码登录。我用这些交换令牌。我将令牌保存在会话中,并在每次调用服务时提交。它可以工作,但是问题是我完全手动执行此操作,而没有使用很多Spring Security oAuth2支持。外观如下: 如您所见,我自己创建了身份验证提供程序。它正在接受该标准,但正在产生自己的扩展,该扩展也保留了实际内容,因此将其保

  • 我们已经实现了 OAuth2 授权服务器(和身份提供程序)。现在,我们要执行负载测试来衡量系统性能。 我现在遇到的具体问题是,我想对授权代码流进行负载测试。到目前为止我一直在用JMeter。但是我不知道如何为所需的redirect_uri提供一个endpoint来完成这个流程。到底有没有办法做到这一点,还是我运气不好?谷歌帮不上忙。如果JMeter做不到,有没有工具可以?

  • 在本主题中,作者将介绍如何跳过授权对话框,根据用户登录和密码获取访问令牌。 我可以访问endpoint并获取访问令牌,然后刷新令牌: 但是当我试图获取用户的电子邮件时,我得到了一个错误: 这种身份验证方法对Microsoft Graph API仍然有效吗?如果没有,是否有其他方法来获得用户授权,只使用登录和密码,没有任何用户交互,只获得他的登录和密码?