Api OAuth中授权代码的用途是什么

Api OAuth中授权代码的用途是什么,api,oauth,oauth-2.0,server-side,Api,Oauth,Oauth 2.0,Server Side,在oauth中,您使用客户机id/secret发出请求以获取授权代码。然后,您发出第二个请求,将授权代码交换为访问令牌。我的问题是: 为什么需要这两步流程而不是首先获取访问令牌?它如何使整个过程更加安全?或者还有其他原因 我说的是服务器端应用程序(比如php)从远程服务器请求授权,而不是javascript。一个请求就可以完成这项任务,它被称为隐式流。有一个请求的response\u type设置为token或id\u token-token 使用访问代码(授权流)而不是直接返回令牌的一般想法是

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

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


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

一个请求就可以完成这项任务,它被称为隐式流。有一个请求的
response\u type
设置为
token
id\u token-token

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

您可以在此处找到更多详细信息:


注意:要获得完整答案,请阅读注释。

在oauth中,您可以使用客户id/secret请求获得授权码。

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

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

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

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

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

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

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

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

公共客户使用。必须使用此选项以避免授权代码被盗。所以在令牌请求(第二次调用)中,客户机将直接发送代码验证器。用户代理无法在第一个请求中获取代码验证程序,因为它已被哈希(代码质询)。所以令牌请求现在包含一个只有客户端和授权服务器知道的秘密


如果您比较这两种情况(公共和机密客户端),您可以看到第二次调用如何增加了额外的安全层

更安全。。。还是更少?取决于它的应用方式

看看:

您会注意到,在服务器端使用auth代码流时,会使用它。还要注意,当请求验证代码时,响应url有一个带问号的查询字符串:

使用spa时,您将使用隐式流。请注意,accesstoken是通过url中的锚(#)发送的

锚定值永远不会发送到服务器。它将只对spa中的客户可用。服务器将永远无法看到访问令牌


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

但是用户(或用户计算机上的软件)不会隐藏访问代码。如果一个像浏览器插件这样的坏软件,先用访问代码交换一个令牌会怎么样。授权服务器将重定向url用作登录页不是更安全吗,但是,通过直接post请求将代码发布到客户端应用程序,而完全不通过用户浏览器。访问代码不是-但是,要将访问代码交换到令牌,您需要提供用户未知的客户端id和客户端机密。然后,根本不需要访问代码。您可以在服务器授予对您的客户端id/secret的访问权限后请求访问令牌。服务器知道您有访问权限。为什么它需要访问代码来证明呢?客户端id和密码是为应用程序而不是为用户而提供的。根据用户凭据授予访问代码。所以我(Jakub)登录LinkedIn并获得访问代码。然后,您的应用程序使用我的访问代码和您的客户端id/secret从LinkedIn检索我的访问令牌隐式授权类型不再推荐。对于公共客户端,应始终将授权代码授予类型与PKCE一起使用