客户端应用使用Oauth

客户端应用使用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一样的值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值