密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。
在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。
![密码模式](https://box.kancloud.cn/2015-09-11_55f28853348d1.png)
它的步骤如下:
> (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"
> }
> ~~~
上面代码中,各个参数的含义参见《授权码模式》一节。
整个过程中,客户端不得保存用户的密码。