關(guān)于 OAuth2.0
OAuth是一個(gè)關(guān)于授權(quán)(authorization)的開放網(wǎng)絡(luò)標(biāo)準(zhǔn)预鬓,在全世界得到廣泛應(yīng)用辛蚊,目前的版本是2.0版。
步驟解釋:
(A)用戶打開客戶端以后叠赐,客戶端要求用戶給予授權(quán)偿洁。
(B)用戶同意給予客戶端授權(quán)涯肩。
(C)客戶端使用上一步獲得的授權(quán)轿钠,向認(rèn)證服務(wù)器申請(qǐng)令牌。
(D)認(rèn)證服務(wù)器對(duì)客戶端進(jìn)行認(rèn)證以后病苗,確認(rèn)無誤疗垛,同意發(fā)放令牌鲁豪。
(E)客戶端使用令牌孵延,向資源服務(wù)器申請(qǐng)獲取資源。
(F)資源服務(wù)器確認(rèn)令牌無誤爱榕,同意向客戶端開放資源阵幸。
微信 OAuth
在微信里的 OAuth 其實(shí)有兩種:公眾平臺(tái)網(wǎng)頁授權(quán)獲取用戶信息花履、開放平臺(tái)網(wǎng)頁登錄。
它們的區(qū)別有兩處挚赊,授權(quán)地址不同诡壁,scope
不同。
-
公眾平臺(tái)網(wǎng)頁授權(quán)獲取用戶信息
授權(quán) URL:
https://open.weixin.qq.com/connect/oauth2/authorize
Scopes:snsapi_base
與snsapi_userinfo
-
開放平臺(tái)網(wǎng)頁登錄
授權(quán) URL:
https://open.weixin.qq.com/connect/qrconnect
Scopes:snsapi_login
他們的邏輯都一樣:
- 用戶嘗試訪問一個(gè)我們的業(yè)務(wù)頁面荠割,例如:
/user/profile
- 如果用戶已經(jīng)登錄妹卿,則正常顯示該頁面
- 系統(tǒng)檢查當(dāng)前訪問的用戶并未登錄(從 session 或者其它方式檢查),則跳轉(zhuǎn)到跳轉(zhuǎn)到微信授權(quán)服務(wù)器(上面的兩種中一種授權(quán) URL)蔑鹦,并告知微信授權(quán)服務(wù)器我的回調(diào)URL(redirect_uri=callback.php)夺克,此時(shí)用戶看到藍(lán)色的授權(quán)確認(rèn)頁面(
scope
為snsapi_base
時(shí)不顯示) - 用戶點(diǎn)擊確定完成授權(quán),瀏覽器跳轉(zhuǎn)到回調(diào)URL:
callback.php
并帶上code
:?code=CODE&state=STATE
嚎朽。 - 在
callback.php
中得到code
后铺纽,通過code
再次向微信服務(wù)器請(qǐng)求得到 網(wǎng)頁授權(quán) access_token與openid
- 你可以選擇拿
openid
去請(qǐng)求 API 得到用戶信息(可選) - 將用戶信息寫入 SESSION。
- 跳轉(zhuǎn)到第 3 步寫入的
target_url
頁面(/user/profile
)哟忍。
邏輯組成
從上面我們所描述的授權(quán)流程來看狡门,我們至少有3個(gè)頁面:
- 業(yè)務(wù)頁面,也就是需要授權(quán)才能訪問的頁面锅很。
- 發(fā)起授權(quán)頁其馏,此頁面其實(shí)可以省略,可以做成一個(gè)中間件爆安,全局檢查未登錄就發(fā)起授權(quán)叛复。
- 授權(quán)回調(diào)頁,接收用戶授權(quán)后的狀態(tài),并獲取用戶信息褐奥,寫入用戶會(huì)話狀態(tài)(SESSION)肤寝。
開始之前
在開始之前請(qǐng)一定要記住,先登錄公眾號(hào)后臺(tái)抖僵,找到邊欄 “開發(fā)” 模塊下的 “接口權(quán)限”,點(diǎn)擊 “網(wǎng)頁授權(quán)獲取用戶基本信息” 后面的修改缘揪,添加你的網(wǎng)頁授權(quán)域名耍群。
如果你的授權(quán)地址為:
http://www.abc.com/xxxxx
,那么請(qǐng)?zhí)顚?www.abc.com
找筝,也就是說請(qǐng)?zhí)顚懪c網(wǎng)址匹配的域名蹈垢,前者如果填寫abc.com
是通過不了的。