在信任的应用(Trusted Applications)中使用Oauth
摘自《OAuth2.0 Identity and Access Management Patterns》
一般在内网中使用密码模式(password grant)和客户端凭证模式(client credentials)
资源拥有者密码凭证授权模式(Resource owner password credentials grant)
密码授权流程就是,客户端带上client_id
和client_secret
,发送用户的用户名和密码(username and password)去获取access_token
,而不需要登陆到网页进行授权(就像授权码授权一样),只需要在客户端应用的UI中直接输入用户名和密码
密码授权的关键特性:
- 在可依赖的客户端使用
- 使用资源拥有者(resource owner)的用户名和密码
- 不是基于重定向(redirection-based)的授权流程,客户端应用只需要向授权服务器发送一次请求,而且用户不需要在接口之间重定向去授权请求
密码授权流程:
- 资源拥有者(resource owner,比如用户),提供用户名和密码缎带客户端
- 客户端应用使用用户的凭证(用户名和密码),和
client_id
和client_secret
向授权服务器发送请求 - 授权服务器根据客户端提供的
client_id
和client_secret
进行认证来决策是否授权同意,并且根据提供的用户名和密码向资源拥有者进行校验,如果者认证通过,授权服务器在响应中返回access_token
请求授权
根据参数构造请求地址:
// do POST
https://api.example-service.com/oauth/authorize?
grant_type=password&
client_id=CLIENT_ID_EXAMPLE&
client_secret=CLIENT_SECRET&
username=USERNAME&
password=PASSWORD
请求参数:
- grant_type: 强制参数,值是
password
- username: 强制参数,由资源拥有者提供(the user)
- password: 强制参数,由资源拥有者提供(the user)
- client_id: 可选参数,在客户端认证使用
- client_secret: 可选参数,在客户端认证使用
- scope: 可选参数,指明代表用户可以访问受保护资源的范围
授权成功
当授权服务器接收到来自客户端请求时,会校验几个地方:
- 校验
client_id
和client_secret
来确保客户端是否被授权 - 校验资源拥有者(resource owner)的作证
响应参数:
- access_token: 强制参数,实际上,客户端将保存这个值并以后使用
- token_type: 强制参数,token的类型
- expires_in: 可选参数,指明
access_token
的生命周期 - refresh_token: 可选参数,在token将要过期的时候去获取新的token
授权错误
如果授权请求失败或者是其他原因,授权服务器将会返回包含错误信息的响应,一些错误的参数:
- invalid_request: 当请求参数中缺少参数或者是值的时候
- invalid_client: 当客户端认证失败,也可能发生在授权参数缺失(
client_id
和client_secret
)或者是客户端尝试使用不支持的方法去认证 - invalid_grant 指定的是无效的、过期的或撤销的,或者它被发送给另一个客户端
- unauthorized_client: 授权服务器认证客户端,但没有授权
- unsupported_grant_type: 授权服务器不支持的授权模式
- invalid_scope: 指定的scope是无效的,未知的或者是畸形的
客户端凭证授权模式(Client credentials grant)
客户端凭证授权模式授权是不包含资源拥有者模块的,也就是说用户(the user)没有参与
在这个模式中,客户端请求access_token
仅仅只是使用客户端凭证(client_id
和client_secret
),代表客户端本身去使用access_token
,相反的,之前是代表授权用户去使用access_token
当服务提供者仅仅是提供一些API方法给客户端,而不是应用到资源拥有者使用的话,这是一个非常好的授权模式。
客户端凭证授权模式关键特性:
- 在可依赖的客户端使用
- 不是基于重定向(redirection_based)
- 使用场景是,客户端直接和服务提供者交互而不是代表资源拥有者本身
客户端凭证授权模式授权步骤:
- 客户端向授权服务器发送请求执行认证
- 授权服务器基于客户端提供的
client_id
和client_secret
认证并作出响应,如果授权成功,客户端将获取到access_token
请求授权(Requesting authorization)
根据参数构造请求地址:
// do POST method
https://api.example-service.com/oauth/authorize?
grant_type=client_credentials&
client_id=CLIENT_ID_EXAMPLE&
client_secret=CLIENT_SECRET
构造请求的参数:
- grant_type: 强制参数,值是
credentials
- scope: 可选参数,指定受保护资源具体哪一部分可以被访问
- client_id: 对于客户端认证来讲是可选参数
- client_secret: 对于客户端认证来讲是可选参数
授权成功
如果授权成功,授权服务器将会返回access_token
,返回的格式如:
{
"access_token":"exampleAccessTokenValue123",
"token_type":"example",
"expires_in":3600
}
注意,客户端凭证授权模式不会发行refresh_token
返回参数:
- access_token: 强制参数,客户端将会存储这个
access_token
并在后期使用 - token_type: 强制参数,代表token的类型
- expires_in token的生命周期(秒)
授权错误
和密码授权模式返回的一样