我对授权码流感到不清楚。隐式流和授权码流的主要区别在于授权码流验证客户端(使用id和秘密)。首先,我定义了授权码流的步骤,并提出了我的疑问。
授权代码流转步骤(部分跳过)
>
授权码请求发送到授权服务器,然后用户重定向到登录页面
request contains
- response_type=auth code
- scope
- state
- redirect_uri
- client-id
如果用户凭证正确,则身份验证服务器使用身份验证代码和状态重定向url
客户端向授权服务器发送访问令牌的发布请求
request contains
- grant type
- code (auth code)
- redirect_uri
- client_id
- client_secret
once auth server validated above request we get access token as reponse
使用访问令牌客户端将访问资源服务器
我的问题是为什么我们在第三步而不是第一步发送客户端机密。如果我们在第一步发送客户端ID和客户端机密,并将用户重定向到登录页面,这样登录后客户端就可以直接获得访问令牌,为什么需要与身份验证代码相关的步骤。
我如何期望上述步骤是
>
用户单击链接,以便请求发送到身份验证服务器。它验证客户端ID和秘密是否有效,然后用户将被重定向到登录页面
request contains
- response_type: access token
- scope
- state
- redirect_uri
- client-id
- client-secret
如果用户凭据正确,则身份验证服务器使用访问令牌和状态重定向url
使用访问令牌客户端将访问资源服务器
客户端身份验证可以在第一步完成,为什么我们需要在第三步通过发送客户端秘密来拖动它。为什么我们需要与身份验证代码相关的步骤,这很混乱,有人能解释一下与身份验证代码相关的步骤的目的吗?
因为授权服务器(可能是Google)发送到浏览器的任何内容都会记录到浏览器中。“身份验证代码”非常短暂(不超过1小时)。访问令牌是长期存在的,因此如果授权服务器在第一步中将访问令牌发送到浏览器,它将被记录到浏览器中,因此如果它通过日志被泄露,其他人将代表您访问该应用程序。