客户端应用使用Oauth
摘自《OAuth2.0 Identity and Access Management Patterns》
隐含授权(implicit grant)
Oauth2.0专门为客户端应用提供了面向公共客户端(public client
,意味着不能可靠的保存他们的credentials,像客户端身份和密码等等)授权流,这种授权模式称为implicit grant
。授权码授权(Authorization Code grant)和隐含授权(implicit grant)的不同在于,隐含授权模式没有使用两次请求(一次是请求authorization code
,一次是请求access token
),相反只请求一次,并且获取access token
作为授权请求的结果
隐含授权模式特性:
- 在公共客户端使用
- 基于重定向流程(redirection-based),和授权码模式一样
access token
会作为重定向登陆点url中的一个参数在请求成功响应之后,像在授权码模式中返回授权码(code)参数一样
授权流程分为以下几步:
- 首先,客户端使用授权登陆点(authorization endpoint)将用户代理(user agent)重定向到授权服务器(authorization server)
- 授权服务器谁资源拥有者(resource owner),决策同意或者是拒绝请求
- 假定资源拥有者同意授权,将响应信息一同重定向到重定向登陆点(
redirection endpoint
),这个重定向登陆点就是初始用于请求提供的。响应信息包含在URL片段中,如access token
和其他参数 - 既然用户代理(user agent)已经重定向回来,包含在响应信息中的
access token
也就传递给了客户端应用程序
请求授权(requesting authorization)
根据重定向地址和参数构造请求地址:
https://api.example-service.com/oauth/authorize?
response_type=token&
client_id=CLIENT_ID_EXAMPLE&
redirect_uri=REDIRECT_ENDPOINT_EXAMPLE
构造请求的一些参数:
- response_type: 强制参数,值必须为
token
- client_id: 强制参数,用户客户端身份认证
- redirect_uri: 可选参数,用户同意授权后,授权服务器使用这个登陆点返回
access token
- scope: 可选参数,和授权码模式一样
- state: 可选参数,和授权码模式一样
授权成功
如果用户同意请求,授权服务器将会重定向到登陆点并且在响应中包含了access_token
,如:
https://client.example.com/oauth/cb#access_token=ACCESS_TOKEN_VALUE&expires_in=3600
可以看到,OAuth2.0提供的参数是出现在这段URL的#
之后,这个对于客户端开发者来讲很重要,因为必须实现从这段URL中提取参数
一些参数:
- access_token: 强制参数,就是客户端需要的
access_token
的值 - expires_in: 可选参数和推荐参数,指定
access_token
生命周期(单位秒) - token_type: 规范中指定的强制参数,但在现实场景中在响应中可以忽略,指的是
token
的类型 - scope: 可选参数
- state: 强制参数,在发送请求的时候使用,返回相同的值
另一个和授权码模式授权不同的是,在隐含授权中,refresh_token
不会返回给客户端应用,当access_token
过期后,客户端重新走整个隐含授权的流程
授权错误
如果用户拒绝授权,或者是redirect_uri
缺失,或者是缺少client_id
,都会造成客户端得到的是错误的响应,如:
https://client.example.com/oauth/cb?error=access_denied&state=APP_STATE
错误响应参数和授权码模式中的错误响应一样:
- invalid_request: 在请求的url中缺失参数或值
- unauthorized_client: 客户端应用没有被授权
- access_denied: 终端用户拒绝这授权
- unsupported_response_type: 授权服务器不支持的请求响应类型
- invalid_scope: 指定的
scope
不存在或者无效 - server_error: 服务器内部发生错误
- temporarily_unavailable: 在给定的时间内服务器没有处理请求
除了error
参数,响应中还有其他类型:
- error_description: 可选参数,描述了错误的信息
- error_uri: 可选参数,uri指向一个web文档,包涵了错误信息的描述
- state: 强制参数,和请求中指定的
state
一样的值