近期把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认证
- 密码模式:用户把用户名和密码发送给第三方应用,第三方应用拿着用户名和密码去授权服务器校验。第三方应用和授权服务器是同一家公司或者是非常可信的大公司。
开发流程
- 搭建认证服务器(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类库
- oauth2-server-php
- league/oauth2-server
- laravel/passport
- authbucket/oauth2-symfony-bundle
-
https://github.com/Filsh/yii2-oauth2-server 这个类库已经很久不更新了,不推荐适用,可以使用
bshaffer/oauth2-server-php