理解OAuth2.0
首先我們通過(guò)一張圖片來(lái)了解一下OAuth2.0的運(yùn)作模式:
從上圖我們可以看到,整個(gè)過(guò)程進(jìn)行了2次“握手”,最終利用授權(quán)的AccessToken進(jìn)行一系列的請(qǐng)求,相關(guān)的過(guò)程說(shuō)明如下:
A:由客戶端向服務(wù)器發(fā)出驗(yàn)證請(qǐng)求,請(qǐng)求中一般會(huì)攜帶這些參數(shù)
ID標(biāo)識(shí),例如appId
驗(yàn)證后跳轉(zhuǎn)到的URL(redirectUrl)
狀態(tài)參數(shù)(可選)
授權(quán)作用域scope(可選)
響應(yīng)類型(可選)
B:服務(wù)器返回一個(gè)grant授權(quán)標(biāo)識(shí)(微信默認(rèn)情況下稱之為code),類似于一個(gè)一次性的臨時(shí)字符串密鑰。如果在A中提供了redirectUrl,這里服務(wù)器會(huì)做一次跳轉(zhuǎn),帶上grant和狀態(tài)參數(shù),訪問(wèn)redirectUrl。
C:客戶端的redirectUrl對(duì)應(yīng)頁(yè)面,憑借grant再次發(fā)起請(qǐng)求,這次請(qǐng)求通常會(huì)攜帶一些敏感信息:
ID標(biāo)識(shí)
密碼
grant字符串(code)
grant類型(可選,微信中默認(rèn)為code)
D:服務(wù)器驗(yàn)證ID標(biāo)識(shí)、密碼、grant都正確之后,返回AccessToken(注意,這里的AccessToken和之前通用接口、高級(jí)接口介紹的AccessToken沒(méi)有關(guān)系,不能交叉使用)
E:客戶端憑借AccessToken請(qǐng)求一系列的API,在此過(guò)程中不再會(huì)攜帶appId,Secret,grant等敏感的信息。
F:服務(wù)器返回請(qǐng)求結(jié)果。
微信的OAuth2.0使用
了解了OAuth2.0的基本原理之后,我們來(lái)看一下OAuth2.0在微信中是如何運(yùn)用的。
假設(shè)一個(gè)場(chǎng)景:用戶進(jìn)入了一個(gè)微信公眾賬號(hào),隨后通過(guò)消息中的鏈接,在微信內(nèi)嵌瀏覽器中打開了一個(gè)游戲網(wǎng)頁(yè),這個(gè)游戲需要用戶登錄并且記錄用戶的游戲得分。
這種情況下我們有兩種處理方式:
讓用戶在網(wǎng)頁(yè)中進(jìn)行注冊(cè)、登錄(并且每次打開這個(gè)網(wǎng)頁(yè)都可能要重新進(jìn)行登錄,因?yàn)槲⑿艃?nèi)置瀏覽器的cookie保存時(shí)間非常短),這個(gè)當(dāng)然是個(gè)很坑爹的設(shè)計(jì)。
利用OAuth2.0。在用戶進(jìn)入這個(gè)頁(yè)面的時(shí)候,先判斷用戶是否登錄,如果沒(méi)有,自動(dòng)跳轉(zhuǎn)到OAuth2.0授權(quán)頁(yè)面,這個(gè)頁(yè)面又自動(dòng)進(jìn)行了上述ABCD一系列驗(yàn)證,再通過(guò)EF得到用戶的OpenId甚至更加詳細(xì)的信息(包括頭像),自動(dòng)完成登錄(或必要的注冊(cè))過(guò)程,隨后用戶以登錄狀態(tài)直接進(jìn)入游戲。
可以看出,使用OAuth2.0大幅度提高了用戶體驗(yàn),并且可以自動(dòng)綁定識(shí)別用戶微信OpenId。
需要注意的是,上面提到的“OAuth2.0授權(quán)頁(yè)面”還有兩種形式:
當(dāng)請(qǐng)求A中的Scope為snsapi_base時(shí),整個(gè)授權(quán)過(guò)程自動(dòng)完成,用戶的客戶端不會(huì)有任何中間頁(yè)面顯示,但是授權(quán)的結(jié)果僅能獲取用戶的OpenId(不管用戶是否已關(guān)注,當(dāng)然如果用戶是關(guān)注用戶,再次利用高級(jí)接口中的用戶信息接口,利用OpenId獲取用戶資料也是可以的,只不過(guò)繞了幾個(gè)彎)
當(dāng)請(qǐng)求A中的Scope為snsapi_userinfo時(shí),需要提供一個(gè)授權(quán)頁(yè)面(類似很多網(wǎng)站利用微博賬號(hào)、QQ號(hào)登陸的那種授權(quán)),僅當(dāng)用戶同意之后,立即獲取到用戶的詳細(xì)信息,這里的用戶可以是關(guān)注用戶,也可以是未關(guān)注用戶,返回的內(nèi)容一致。
也就是說(shuō),snsapi_base的方法可以“神不知鬼不覺”地獲取用戶OpenId,全自動(dòng)完成登錄注冊(cè)過(guò)程,但是信息量有限;snsapi_userinfo需要用戶在指定界面上授權(quán)之后,自動(dòng)完成整個(gè)過(guò)程,這個(gè)授權(quán)有一個(gè)時(shí)間段,超過(guò)時(shí)間后需要重新詢問(wèn)用戶。
Senparc.Weixin.MP OAuth2.0接口
源文件文件夾:Senparc.Weixin.MP/AdvancedAPIs/OAuth
源代碼中相關(guān)方法如下:
namespace Senparc.Weixin.MP.AdvancedAPIs { //官方文檔:http://mp.weixin.qq.com/wiki/index.php?title=%E7%BD%91%E9%A1%B5%E6%8E%88%E6%9D%83%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E5%9F%BA%E6%9C%AC%E4%BF%A1%E6%81%AF#.E7.AC.AC.E4.B8.80.E6.AD.A5.EF.BC.9A.E7.94.A8.E6.88.B7.E5.90.8C.E6.84.8F.E6.8E.88.E6.9D.83.EF.BC.8C.E8.8E.B7.E5.8F.96code /// <summary> /// 應(yīng)用授權(quán)作用域 /// </summary> public enum OAuthScope { /// <summary> /// 不彈出授權(quán)頁(yè)面,直接跳轉(zhuǎn),只能獲取用戶openid /// </summary> snsapi_base, /// <summary> /// 彈出授權(quán)頁(yè)面,可通過(guò)openid拿到昵稱、性別、所在地。并且,即使在未關(guān)注的情況下,只要用戶授權(quán),也能獲取其信息 /// </summary> snsapi_userinfo } public static class OAuth { /// <summary> /// 獲取驗(yàn)證地址 /// </summary> /// <param name="appId"></param> /// <param name="redirectUrl"></param> /// <param name="state"></param> /// <param name="scope"></param> /// <param name="responseType"></param> /// <returns></returns> public static string GetAuthorizeUrl(string appId, string redirectUrl, string state, OAuthScope scope, string responseType = "code") { var url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type={2}&scope={3}&state={4}#wechat_redirect", appId, redirectUrl.UrlEncode(), responseType, scope, state); /* 這一步發(fā)送之后,客戶會(huì)得到授權(quán)頁(yè)面,無(wú)論同意或拒絕,都會(huì)返回redirectUrl頁(yè)面。 * 如果用戶同意授權(quán),頁(yè)面將跳轉(zhuǎn)至 redirect_uri/?code=CODE&state=STATE。這里的code用于換取access_token(和通用接口的access_token不通用) * 若用戶禁止授權(quán),則重定向后不會(huì)帶上code參數(shù),僅會(huì)帶上state參數(shù)redirect_uri?state=STATE */ return url; } /// <summary> /// 獲取AccessToken /// </summary> /// <param name="appId"></param> /// <param name="secret"></param> /// <param name="code">code作為換取access_token的票據(jù),每次用戶授權(quán)帶上的code將不一樣,code只能使用一次,5分鐘未被使用自動(dòng)過(guò)期。</param> /// <param name="grantType"></param> /// <returns></returns> public static OAuthAccessTokenResult GetAccessToken(string appId, string secret, string code, string grantType = "authorization_code") { var url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type={3}", appId, secret, code, grantType); return CommonJsonSend.Send<OAuthAccessTokenResult>(null, url, null, CommonJsonSendType.GET); } /// <summary> /// 刷新access_token(如果需要) /// </summary> /// <param name="appId"></param> /// <param name="refreshToken">填寫通過(guò)access_token獲取到的refresh_token參數(shù)</param> /// <param name="grantType"></param> /// <returns></returns> public static OAuthAccessTokenResult RefreshToken(string appId, string refreshToken, string grantType = "refresh_token") { var url = string.Format("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type={1}&refresh_token={2}", appId, grantType, refreshToken); return CommonJsonSend.Send<OAuthAccessTokenResult>(null, url, null, CommonJsonSendType.GET); } public static OAuthUserInfo GetUserInfo(string accessToken,string openId) { var url = string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}",accessToken,openId); return CommonJsonSend.Send<OAuthUserInfo>(null, url, null, CommonJsonSendType.GET); } } }
具體的示例方法見Senparc.Weixin.MP.Sample/Controllers/OAuth2Controller.cs,以及對(duì)應(yīng)視圖的代碼。
注意點(diǎn)
必須是通過(guò)認(rèn)證的服務(wù)號(hào)才可以使用OAuth接口。
接口中用到的AccessToken和高級(jí)接口(包括通用接口)中用到的AccessToken互不相關(guān),即使他們都是通過(guò)相同的AppId和Secret得到的。
目前官方的授權(quán)頁(yè)面不是100%穩(wěn)定,有時(shí)候需要多點(diǎn)幾次才能順利通過(guò),如果發(fā)現(xiàn)此類情況,需要做一些判斷反復(fù)請(qǐng)求,至少在表面上可以不讓用戶看到錯(cuò)誤頁(yè)面。
出于安全,在使用OAuth2.0之前,需要進(jìn)入到微信后臺(tái)的【我的服務(wù)】對(duì)回調(diào)頁(yè)面的域名進(jìn)行設(shè)置:
更多微信公眾平臺(tái)開發(fā):OAuth2.0說(shuō)明相關(guān)文章請(qǐng)關(guān)注PHP中文網(wǎng)!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)