OAuth学习整理

近期把OAuth系统学习一下,并完成了授权码模式的PHP实现,此篇文章主要介绍OAuth相关知识,分享一些参考资料。

OAuth

OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。

系统角色

(1) Third-party application:第三方应用程序,本文中又称"客户端"(client),即上一节例子中的"云冲印"。

(2)HTTP service:HTTP服务提供商,本文中简称"服务提供商",即上一节例子中的Google。

(3)Resource Owner:资源所有者,本文中又称"用户"(user)。

(4)User Agent:用户代理,本文中就是指浏览器。

(5)Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。

(6)Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。

运行流程

运行流程

客户端的授权模式

客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0定义了四种授权方式。

  • 授权码模式(authorization code)
  • 简化模式(implicit)
  • 密码模式(resource owner password credentials)
  • 客户端模式(client credentials)

如何选择适合的授权模式

授权模式选择
  • 授权码模式:第三方WEB应用常用模式,用户登录三方应用,获得临时授权code, 第三方应用通过code换取access_token ,访问资源服务器。
  • 简化模式: 基于浏览器认证,可以用在浏览器单页应用。
  • 客户端模式:客户端直接获取授权,与用户无关,一般用于API认证
  • 密码模式:用户把用户名和密码发送给第三方应用,第三方应用拿着用户名和密码去授权服务器校验。第三方应用和授权服务器是同一家公司或者是非常可信的大公司。
授权码模式

开发流程

  1. 搭建认证服务器(Authorization server)
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
        &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1

参数解释:

  • response_type:表示授权类型,此处的值固定为"token",必选项。
  • client_id:表示客户端的ID,必选项。
  • redirect_uri:表示重定向的URI,可选项。
  • scope:表示权限范围,可选项。
  • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。

用户认证成功,重定向到 redirect_uri 网页,携带code

HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
          &state=xyz

客户端像认证服务器换取 access_token

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

2.搭建资源服务器(Resource serve)

POST /api/user HTTP/1.1
Host: server.example.com
access_token=2YotnFZFEjr1zCsicMWpAA

注意事项

  • 应用ID申请:第三方应用程序需要向认证服务器提供商申请,需要填写应用的名称,回调地址,返回client_id和client_secret
  • 用户登录过程:认证服务器必须实现一种登录认证方式,可以是登录页,也可以通过HTTP Basic等方式。
  • redirect_uri: 回调地址必须和申请应用填写保持一致。
  • state:通常做法是将stata和用户会话绑定,在申请token时携带客户端身份,可以用于防止跨站请求攻击(CSRF),认证服务器也可以强制要求客户端携带state

OAuth2的PHP类库

资料

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 124,514评论 18 136
  • 以下是官网直译:https://oauth.net/ 1. 首页 OAuth是一种开放协议(注:协议是公开的,任何...
    KennethChen93阅读 6,487评论 0 20
  • Spring Cloud入门教程系列: Spring Cloud入门教程(一):服务治理(Eureka) Spri...
    CD826阅读 18,111评论 2 30
  • 自出生起,我就只有一个身份,就是学生。全日制学生就和一份工作一样,有绩效测评,有上下班,有同僚。虽然很多人不赞同,...
    花花骚年阅读 208评论 1 1
  • 日常的沟通中,“假如”这个词似乎不经意的被频繁使用。 一个是“假如”事实可能存在。常常在大家各抒起见...
    懂生活阅读 104评论 0 0
  • 亲爱的M先生: 你好!(希望你不要生气才好,因为我不知道你的名字,所以只好随便取了一个代号,M,我蛮喜欢...
    青山_9cb2阅读 80评论 0 0
  • 软件商店里最好用的效率APP都被我搬回来了! 而且这篇文章会偷偷告诉你效率App 1+1> 2的开挂用法! 1.f...
    橙小橙bean阅读 1,596评论 1 7
  • 姑娘,千万别把绅士行为误以为是好感,然后还自以为是个人魅力,强行撩汉。姑娘,你要自信,没必要被人对你施与芝麻点的恩...
    刘阿文阅读 200评论 4 2