OAuth的隐式授权和授权码授权有什么区别?

9
我希望更好地理解隐式授权流和授权码授权流之间的区别,因为我不确定我的当前理解是否正确。
1. 隐式授权流主要由前端应用程序用于对用户进行身份验证吗? 2. 隐式授权流仅需要 client_id、用户名和密码进行身份验证,也就是说 client_secret 从未被发送过吗? 3. 授权码只是一个短期令牌吗? 4. 在将授权码交换为访问令牌后,客户端可以访问用户账户多长时间?具体来说,如果客户端是长时间运行的脚本,用户是否需要每次运行脚本时进行身份验证?还是我们可以假定在用户授权一次后,客户端有权限随时访问用户(除非用户撤销访问权限),因此只需要使用客户端凭证进行身份验证? 5. 使用授权码流相比隐式流的优势是什么? 6. 资源服务器自身需要一个客户端 ID 吗?
谢谢。
2个回答

5

OAuth 2.0授权框架(RFC 6749) 暗示:

Implicit Flow只适用于基于浏览器或JavaScript的OAuth客户端应用程序,而不适用于移动设备或其他可以使用授权代码授予的应用程序。

隐式授权类型用于获取访问令牌(不支持发放刷新令牌),并针对已知操作特定重定向URI的公共客户端进行了优化。

请参阅第1.3.2节和第9节,了解使用隐式授权的背景。请参阅第10.3节和第10.16节,了解在使用隐式授权时的重要安全考虑。

当使用隐式授权类型时,访问令牌会在URI片段中传输,这可能会将其暴露给未经授权的方。

-jim


有什么方法可以阻止他人扩展您的服务并构建一个仅使用隐式授权的移动应用程序呢? - Freid001
1
授权服务器可以根据客户端注册和其他可用参数(例如用户代理类型)决定不接受隐式授权。 - jwilleke

4
虽然jwilleke回答了你大部分的问题,但我会回答你具体的问题,
1. 隐式流程是为那些无法执行令牌请求的客户端设计的。来自OAuth 2.0规范 - 4.2节

隐式授权类型用于获取访问令牌(不支持发放刷新令牌),并针对已知操作特定重定向URI的公共客户端进行了优化。这些客户端通常使用脚本语言(如JavaScript)在浏览器中实现。

  1. 它被公共客户端使用。他们没有客户端密钥。这是因为他们无法保护这样的密钥,因为它们在浏览器上运行。

  2. 授权码的生命周期可以是几秒钟(30秒)到几分钟(2分钟)。与其他令牌相比,它们的生命周期较短。

  3. 这取决于访问令牌的生命周期。如果存在长时间运行的任务并且令牌过期,则必须获取新的访问令牌进行授权。但是如果您的特定后端建立会话,则其寿命可能比访问令牌更长。

  4. 一个优点是刷新令牌。它可以用于刷新访问令牌而无需用户交互(即重新登录)。此外,根据OAuth服务器的实现方式,您可能会获得具有不同生命周期的访问令牌。例如,由于公共客户端使用隐式流,授权服务器可能会发出短期访问令牌。

  5. 这取决于情况。如果资源服务器需要从另一个资源服务器消耗受保护的资源,并使用访问令牌进行授权,则您的资源服务器也需要客户端ID并遵循特定的流程来获取令牌。但是,如果它不与外部通信,则无需为其获取客户端ID。


当你说“建立一个会话”时,你是否意味着后端应用程序已经通过交换客户端凭据来进行身份验证,而不是通过授权代码进行身份验证? - Freid001
如果是这样的话,一旦用户已经同意了客户端对特定资源的访问。那么,客户端是否可以在未来使用client_credentials进行身份验证,并仍然获得已同意的资源访问权限。 - Freid001
@Freid001 不是客户端凭证。后端可以验证访问令牌,如果有效,则建立客户端之间的会话。 - Kavindu Dodanduwa
@Freid001 不要混淆客户端凭据和资源所有者授权。在OAuth上下文中,它们是两个不同的东西(一开始很容易混淆)。客户端是您的应用程序,用于访问受保护的资源。最终用户是典型的人类用户(或类似的用户)。客户端凭据不会暴露给受保护的资源,但在OAuth 2中有一些流程可以让您将其与authN服务器交换以获取令牌。 - Kavindu Dodanduwa
客户端凭证流程允许应用程序在没有用户上下文的情况下获取令牌吗? - Freid001
@Freid001 正确。但此流程是特殊的,仅在客户端保密时使用。在此处查看文档 - https://tools.ietf.org/html/rfc6749#section-4.4 - Kavindu Dodanduwa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接