Oauth 2.0 oAuth2.0:为什么需要;授权码“;然后才是代币?
使用oAuth 2.0,在“authorization code”authorization Grant中,我首先调用“/authorize”,获取代码,然后在调用“/token”中使用此代码来获取访问令牌 我的问题:为什么这是流?我想这是出于安全原因,但我想不出来。为什么实现是这样的,而不是在第一次调用(“/authorize”)后立即获取访问令牌 为什么我们需要此代码?授权代码流适用于涉及三方的场景 这些缔约方是:Oauth 2.0 oAuth2.0:为什么需要;授权码“;然后才是代币?,oauth-2.0,Oauth 2.0,使用oAuth 2.0,在“authorization code”authorization Grant中,我首先调用“/authorize”,获取代码,然后在调用“/token”中使用此代码来获取访问令牌 我的问题:为什么这是流?我想这是出于安全原因,但我想不出来。为什么实现是这样的,而不是在第一次调用(“/authorize”)后立即获取访问令牌 为什么我们需要此代码?授权代码流适用于涉及三方的场景 这些缔约方是: 客户端 用户使用其web浏览器。他想使用你的应用程序 提供商 包含有关用户
- 客户端 用户使用其web浏览器。他想使用你的应用程序
- 提供商 包含有关用户的信息。如果有人想访问这些数据,用户必须首先同意
- 您的(web)应用程序 要从提供程序访问有关用户的信息
/authorize
端点):
嘿,用户,这是我的客户id。请与提供商联系,并允许他直接与我联系
因此,用户与提供商对话(请求授权码并通过在其浏览器中打开您的回调URL将其返回到您的应用程序):
嘿,提供商,我想使用这个应用程序,所以他们需要访问我的数据。给我一些代码,我给应用程序这个代码
现在,您的应用程序具有授权代码,该代码已被客户端和提供商知晓。通过将此信息交给提供商,您的应用程序现在可以证明客户端允许其访问其数据。提供商现在向您的(web)应用程序颁发访问令牌,这样您的(web)应用程序就不必每次都重复这些步骤(至少在一段时间内)
如果其他应用程序类型的应用程序直接在客户端运行(如iPhone/Android应用程序或Javascript客户端),则中间步骤是多余的。是否也可以通过此中间步骤防止客户端看到访问令牌 来自O'Reilly的书: 授权代码此授权类型最适合服务器端web应用程序。在资源所有者 通过授权访问他们的数据,他们将被重定向回web 将授权代码作为查询参数的应用程序 网址。客户端必须将此代码交换为访问令牌 应用此交换是服务器对服务器进行的,需要 客户端id和客户端机密,甚至阻止资源 所有者无法获取访问令牌。这种赠款类型还允许 通过使用刷新令牌对API的长期访问 基于浏览器的客户端应用程序的隐式授权隐式授权是所有流中最简单的,并且经过优化 用于在浏览器中运行的客户端web应用程序。资源 所有者授予对应用程序的访问权,并创建一个新的访问令牌 立即生成并使用#散列传递回应用程序 URL中的片段。应用程序可以立即提取 从散列片段访问令牌(使用JavaScript)并生成API 请求。此授予类型不需要中间人 “授权码”,但它也不允许刷新 用于长期访问的令牌 更新-确实是: 什么时候应该使用授权代码流?授权 在以下情况下应使用代码流:
- 需要长期访问
- OAuth客户端是一个web应用程序服务器
- API调用的责任是非常重要的,OAuth令牌不应该泄漏到浏览器,用户可以在浏览器中访问 它。
客户端的数据通常被认为是不安全的。在隐式调用的情况下,令牌在初始步骤中被授予,任何具有访问令牌的人都可以请求数据,API不知道谁在调用该API 但是,在web服务器应用程序中,如果应用程序希望识别自身,则会将带有客户端密码的客户端id与授权码一起发送,以获取访问令牌,该令牌将来可以独立发送 假设,如果access_token最初是自己授予的,那么作为客户端_id和access_token仍将被视为公开的,因此应用程序每次都必须发送access_token之外的客户端_secret,以确保请求确实来自它
而在当前场景中,在获得访问令牌后,可以独立地进行进一步的请求,而不需要客户端密钥。我认为是这样的 当我们使用授权码时,我们有2个验证部分强>
- 一,;验证用户的所有权,因为他已登录
- 二,;我们知道客户实际上就是他所说的那个人,因为客户在给他的客户发送秘密