破解微信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 拉取用戶信息.

相關文章
相關標籤/搜索