這篇文章主要為大家展示了“微信公眾平臺(tái)開發(fā)之OAuth2.0有什么用”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“微信公眾平臺(tái)開發(fā)之OAuth2.0有什么用”這篇文章吧。
成都創(chuàng)新互聯(lián)公司是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站模板,微信公眾號(hào)開發(fā),軟件開發(fā),微信小程序開發(fā),10多年建站對(duì)成都銅雕雕塑等多個(gè)領(lǐng)域,擁有多年的網(wǎng)站維護(hù)經(jīng)驗(yàn)。
理解OAuth3.0
首先我們通過(guò)一張圖片來(lái)了解一下OAuth3.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沒有關(guān)系,不能交叉使用)
E:客戶端憑借AccessToken請(qǐng)求一系列的API,在此過(guò)程中不再會(huì)攜帶appId,Secret,grant等敏感的信息。
F:服務(wù)器返回請(qǐng)求結(jié)果。
微信的OAuth3.0使用
了解了OAuth3.0的基本原理之后,我們來(lái)看一下OAuth3.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ì)。
利用OAuth3.0。在用戶進(jìn)入這個(gè)頁(yè)面的時(shí)候,先判斷用戶是否登錄,如果沒有,自動(dòng)跳轉(zhuǎn)到OAuth3.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)入游戲。
可以看出,使用OAuth3.0大幅度提高了用戶體驗(yàn),并且可以自動(dòng)綁定識(shí)別用戶微信OpenId。
需要注意的是,上面提到的“OAuth3.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 OAuth3.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/oauth3/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/oauth3/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/oauth3/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/OAuth3Controller.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è)面。
出于安全,在使用OAuth3.0之前,需要進(jìn)入到微信后臺(tái)的【我的服務(wù)】對(duì)回調(diào)頁(yè)面的域名進(jìn)行設(shè)置:
以上是“微信公眾平臺(tái)開發(fā)之OAuth2.0有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
標(biāo)題名稱:微信公眾平臺(tái)開發(fā)之OAuth2.0有什么用
當(dāng)前URL:http://chinadenli.net/article26/ihoscg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、網(wǎng)站排名、網(wǎng)站設(shè)計(jì)公司、App開發(fā)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)