OAuth中授权码的用途是什么

What is the purpose of authorization code in OAuth

在 oauth 中,您使用客户端 id/secret 发出请求以获取授权码。然后您发出第二个请求以将授权代码交换为访问令牌。我的问题是:

为什么需要这两个步骤而不是首先获取访问令牌?它如何使整个过程更加安全?还是有别的原因。

我说的是服务器端应用程序(例如 php)从远程服务器请求授权,而不是 javascript。

可以通过单个请求来完成 - 它被称为 隐式流。有一个 response_type 设置为 tokenid_token token.

的请求

使用访问代码(授权流程)而不是直接返回令牌的一般想法是对最终用户隐藏它们。第二个请求通常由后端服务器而不是浏览器完成。

您可以在此处找到更多详细信息:https://auth0.com/docs/api-auth/which-oauth-flow-to-use

注意:完整答案请阅读评论。

在 oauth 中,您使用客户端 id/secret 发出请求以获取授权码。

授权码请求不包含客户端密码。它仅包含客户端 ID 和重定向 url,这使授权服务器能够验证来自已知客户端的请求。

这两个步骤需要什么而不是首先获取访问令牌?它如何使整个过程更加安全?还是有别的原因。

如果我们忘记隐式流,它涉及从第一次调用中检索访问令牌,我会说这是为了提高安全性。

当使用授权代码流程时,您使用用户代理(浏览器)启动流程。这意味着,用户代理会将最终用户重定向到授权服务器进行身份验证(用户名密码获取和验证最终用户)。如果最终用户验证成功,授权服务器发送授权码。这是一个临时密文,与原始授权码请求绑定。

现在客户端使用授权码并直接联系授权服务器获取访问(和其他)令牌。第二步发生在用户代理之外。

如果客户端是机密客户端,即具有客户端 ID 和客户端密码的客户端,则第二次调用将需要生成此客户端密码。所以它内部包含一个客户端验证过程。从授权服务器的角度来看,如果客户端身份验证失败,令牌请求将被拒绝。这为授权码窃取提供了保护。

此外,在第二步中,我们避免将访问令牌暴露给第三方。例如,在隐式流中,访问令牌作为 URL 片段通过用户代理发送。如果用户代理遭到破坏(例如:- 被某些恶意代码操纵),则可以提取此访问令牌。

public 客户呢?这意味着由于其性质而无法获得客户机密的客户(例如:- 无法通过存储来保护机密的客户)

Public 个客户使用 PKCE。必须使用它来避免授权码被窃取。所以在token请求中(第二次调用),client会直接发送code verifier。用户代理无法在第一个请求中获得代码验证器,因为它已被散列(代码挑战)。所以令牌请求现在包含一个只有客户端和授权服务器知道的秘密。

如果比较这两种情况(public 和机密客户端),您会发现第二个调用如何增加额外的安全层。

更安全……还是更安全?取决于它是如何应用的。

看看: https://auth0.com/docs/api-auth/which-oauth-flow-to-use

您会注意到在服务器端使用时会使用授权代码流。还要注意,当请求授权代码时,响应 url 有一个带问号的查询字符串:https://example-app.com/redirect?code=g0ZGZmNjVmOWI&state=dkZmYxMzE2

使用水疗中心时,您将使用隐式流程。请注意,访问令牌是通过 url https://example-app.com/redirect#access_token=MyMzFjNTk2NTk4ZTYyZGI3

中的锚点 (#) 发送的

永远不会将锚值发送到服务器。它仅供水疗中心的客户使用。服务器将永远无法看到访问令牌。

当服务器应用程序获得重定向时,它必须能够读取它。它可以,因为 url 有一个问号而不是 #。如果它直接发送令牌,客户端可以在他的浏览器历史记录中或通过 fiddler 看到访问令牌。