破解微信Authorize 受权登陆服务服务端课客户端使用

关于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


若是客户端需求较长的token有效期,客户端执行下面四大步骤的第三步,则服务端必须增长

(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");

基于Authorization Code模式

受权码授予类型用于得到访问权限令牌和刷新令牌,并为机密客户进行了优化。由于这是一个基于重定向的流程,客户端必须可以
与资源全部者的用户代理(一般是一个网络浏览器)和可以接收来的请求(经过重定向)从受权服务器。浏览器

Authorization Code 序列图

Note:Authorization Code 模式的序列图安全


服务端实现见github

https://github.com/eric-admin/oauth2-server-php

第一步:用户赞成受权,获取code [GET]

例如 :(服务端: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 参数.

第二步:经过code换取网页受权access_token [POST]

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(若是须要) [POST]

因为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",
}

第四步:登陆拉取用户信息(需scope为 snsapi_userinfo) [POST]

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"
    }
}

基于User Credentials模式

资源拥有者密码凭据授予类型是合适的资源拥有者与之信任关系的案例客户端,如设备操做系统或具备很强的特权应 用。受权服务器应采起特殊照顾启用此批批类型,只有当其余流不可行的。此批批类型是适合客户得到的资源全部者的凭据(用户名和密码,一般使用互动式的形 式。它也用来迁移现有的客户使用直接的认证方案,如HTTP基本或摘要经过将存储的凭据的OAuth认证访问令牌。

user credentials

Note:User Credentials模式序列图

第一步:经过服务端 的username,password换取网页受权access_token [POST]

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 拉取用户信息.

相关文章
相关标签/搜索