OAuth 2.0 密码凭证授权
创建时间:2024年07月26日 09:43:45 最后更新:2024年07月27日 03:34:43

用户向客户端提供自己的用户名和密码。客户端使用这些用户信息,向 服务提供商 请求授权。

在这种模式中,用户必须把自己的密码给客户端,但是客户端默认不储存密码,所以通常用在用户对客户端高度信任的情况下,比如:客户端是操作系统的一部分,或由一个著名公司出品。

注意:认证服务器只有在其他授权模式无法执行的情况下,才会考虑使用这种模式

+----------+
| Resource |
| Owner |
| |
+----------+
v
| Resource Owner
(A) Password Credentials
|
v
+---------+ +---------------+
| |>--(B)---- Resource Owner ------->| |
| | Password Credentials | Authorization |
| Client | | Server |
| |<--(C)---- Access Token ---------<| |
| | (w/ Optional Refresh Token) | |
+---------+ +---------------+

步骤如下: (A):用户向客户端提供用户名和密码。 (B):客户端将用户名和密码发给认证服务器,向后者请求令牌。 (C):认证服务器确认无误后,向客户端提供访问令牌。 B步骤中,客户端发出的HTTP请求,包含以下参数:

  • grant_type:表示授权类型,此处的值固定为 password必选项
  • username:表示用户名,必选项
  • password:表示用户密码,必选项
  • scope:表示权限范围,可选项。 例子:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=password&username=johndoe&password=A3ddj3w

C步骤中,认证服务器向客户端发送访问令牌,例子:

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
 "token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}

整个过程中,客户端不得保存用户的密码。

适用场景

  • 这种模式适用于用户对应用程序高度信任的情况。
  • 认证服务器只有在其他授权模式无法执行的情况下,才会考虑使用这种模式。