关于OAuth2 php
OAuth2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0即彻底废止了OAuth1.0。 OAuth 2.0关注客户端开发者的简易性。要么经过组织在资源拥有者和HTTP服务商之间的被批准的交互动做表明用户,要么容许第三方应用表明用户得到访问的权 限。同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。git
关于受权模式github
开发者可经过网页受权接口调用凭证,access_token来登录获取用户基本信息.OAuth2受权模式(Grant Type)有
Authorization Code,User Credentials,Refresh Token,Implicit,Client Credentials,JWT Bearer。目前测试了Authorization Code,User Credentials两种模式,其余的后续会有些补充。api
(1)配置文件 config/production/oauth2lifetime.php 为了安全设计,access_token时间值有效期较短,可用 refresh_token 刷新access_token 配置文件 config/production/oauth2lifetime.php的配置项以下return array( 'refresh_token_lifetime' => 315360000, //配置受权的refresh token的有效刷新时间,若是注释此项,默认1209600秒(14天) 'access_lifetime' => 86400 //配置受权容许访问的生命周期时间,若是注释此项,默认3600秒(1小时)); (2)新增 refresh_token 受权类型(refresh_token类型,依附于authorization_code或password,不可独立存在),必须插入容许的refresh_token受权类型的客户端信息 INSERT INTO sys_oauth_clients (client_id, client_secret, redirect_uri, grant_types, scope) VALUES ("wx62fdabd2c88c5214", "832daaf5e66551116b958eb12fe15c8c", "http://www.icome.com", "refresh_token", "snsapi_userinfo");
受权码授予类型用于得到访问权限令牌和刷新令牌,并为机密客户进行了优化。由于这是一个基于重定向的流程,客户端必须可以
与资源全部者的用户代理(一般是一个网络浏览器)和可以接收来的请求(经过重定向)从受权服务器。浏览器
Note:Authorization Code 模式的序列图安全
例如 :(服务端:http://www.eric.aysaas.com 客户端:http://www.icome.com )服务器
参数说明测试
参数 | 是否必须 | 说明 |
---|---|---|
client_id | 是 | 链接服务端的客户端在服务端上的惟一标识 |
redirect_uri | 是 | 受权后重定向的回调连接地址 |
response_type | 是 | 返回类型,请填写code |
grant_type | 是 | 返回类型,请填写authorization_code |
scope | 是 | 应用受权做用域,请填写snsapi_userinfo (弹出受权页面,可经过access_token拿到昵称、性别、只要用户受权,就能获取其信息) |
state | 否 | 重定向后会带上state参数,开发者能够填写a-zA-Z0-9的参数值,最多128字节 |
下图为scope等于snsapi_userinfo时的受权页面:优化
若是用户赞成受权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。若用户禁止受权,则重定向后不会带上code参数,仅会带上state参数redirect_uri?state=STATE
code说明 :
code做为换取access_token的票据,每次用户受权带上的code将不同,code只能使用一次,30秒未被使用自动过时。
Note :为了安全性,https跳转到http时,http头无 http_referer 参数.
http://www.eric.aysaas.com/api2/oauth2/token
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
client_id | 是 | 链接服务端的客户端在服务端上的惟一标识 |
client_secret | 是 | 链接服务端的客户端在服务端上的惟一标识对应的密码 |
code | 是 | 填写第一步获取的code参数 |
grant_type | 是 | 填写为authorization_code |
Note: 请快速操做, 由于 Authorization Codes 30 秒内有效!
返回说明
正确时返回的JSON数据包以下:
{
"access_token":"a669981340c84d6112e4800ff50afd7daf3590b7",
"expires_in":"3600",
"token_type":"Bearer",
"scope":"snsapi_userinfo",
"refresh_token":"0c3ac3a064359ae8a5a031a196236b72641ec545",
}
因为access_token拥有较短的有效期,当access_token超时后,可使用refresh_token进行刷新,
refresh_token拥有较长的有效期(系统默认14天,可由配置文件修改),为了安全,当refresh_token失效的后,须要用户从新受权。
请求方法
获取第二步的refresh_token后,请求如下连接获取access_token:
http://www.eric.aysaas.com/api2/oauth2/token
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
client_id | 是 | 链接服务端的客户端在服务端上的惟一标识 |
client_secret | 是 | 链接服务端的客户端在服务端上的惟一标识对应的密码 |
grant_type | 是 | 填写 refresh_token |
refresh_token | 是 | 获取第二步的refresh_token |
返回说明
正确时返回的JSON数据包以下:
{
"access_token":"cff6652829efd9551b2526b0f82cbf21e1e9e11c",
"expires_in":"3600",
"token_type":"Bearer",
"open_id":"d3g2MmZkMjEyMzJmMjk3YTU3YTVh",
"scope":"snsapi_userinfo",
}
http://www.eric.aysaas.com/api2/oauth2/resource
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
access_token | 是 | 网页受权接口调用凭证,access_token |
Note: access_token, 有效期3600秒!
返回说明
正确时返回的JSON数据包以下:
{
"status":200,
"result":
{
"id":"2",
"user_id":"admin",
"real_name":"管理员",
"avatar":"http:\/\/fileio.eric.aysaas.com\/api\/user\/avatar\/show\/120\/120\/admin",
"sex":"0",
"create_time":"0000-00-00 00:00:00"
}
}
资源拥有者密码凭据授予类型是合适的资源拥有者与之信任关系的案例客户端,如设备操做系统或具备很强的特权应 用。受权服务器应采起特殊照顾启用此批批类型,只有当其余流不可行的。此批批类型是适合客户得到的资源全部者的凭据(用户名和密码,一般使用互动式的形 式。它也用来迁移现有的客户使用直接的认证方案,如HTTP基本或摘要经过将存储的凭据的OAuth认证访问令牌。
Note:User Credentials模式序列图
http://www.eric.aysaas.com/api2/oauth2/token
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
client_id | 是 | 链接服务端的客户端在服务端上的惟一标识 |
client_secret | 是 | 链接服务端的客户端在服务端上的惟一标识对应的密码 |
grant_type | 是 | 填写为password |
username | 是 | 用户在服务端上的用户名 |
password | 是 | 用户在服务端上的密码 |
返回说明
正确时返回的JSON数据包以下:
{
"access_token":"805f21204330018e1168a6984acab7b2f5e3ab82",
"expires_in":"3600",
"token_type":"Bearer",
"scope":"null",
"refresh_token":"bf75b37b527ef92be4a2e289223f85ba6bc9adbb",
}
而后同Authorization Code第三步,用受权接口调用凭证 access_token 拉取用户信息.