关于OAuth2
OAuth2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。 OAuth 2.0关注客户端开发者的简易性。要么通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户,要么允许第三方应用代表用户获得访问的权 限。同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。
关于授权模式
开发者可通过网页授权接口调用凭证,access_token来登陆获取用户基本信息.OAuth2授权模式(Grant Type)有
Authorization Code,User Credentials,Refresh Token,Implicit,Client Credentials,JWT Bearer。目前测试了Authorization Code,User Credentials两种模式,其他的后续会有些补充。
(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 )
http://www.eric.aysaas.com/api2/oauth2/authorize?client_id=wx62fdabd2c88c5214&response_type=code&scope=snsapi_userinfo&grant_type=authorization_code&client_secret=832daaf5e66551116b958eb12fe15c8c&state=4
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
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 拉取用户信息.