破解微信Authorize 授权登录服务服务端课客户端使用

关于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两种模式,其他的后续会有些补充。


如果客户端需求较长的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模式

授权码授予类型用于获得访问权限令牌和刷新令牌,并为机密客户进行了优化。因为这是一个基于重定向的流程,客户端必须能够
与资源所有者的用户代理(通常是一个网络浏览器)和能够接收来的请求(通过重定向)从授权服务器。

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时的授权页面:

破解微信Authorize 授权登录服务服务端课客户端使用

用户同意授权后

如果用户同意授权,页面将跳转至 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认证访问令牌。

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


你可能感兴趣的:(原理,单点登陆,AUTH2.0,破解微信授权登录)