日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OAuth2.0实战

發(fā)布時(shí)間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OAuth2.0实战 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

微信開發(fā)三大坑:
1、微信OAuth2.0授權(quán)
2、微信jssdk簽名
3、微信支付簽名

本篇先搞定微信OAuth2.0授權(quán)吧!
實(shí)際一旦了解微信的OAuth2.0,其他的也掌握了。

以簡書的登陸頁面為例,來了解一下oauth2.0驗(yàn)證授權(quán)的一些背景知識(shí):


簡書登陸.jpg

1) 傳統(tǒng)的注冊(cè)登陸方式:
如果你是一個(gè)新用戶,則點(diǎn)擊新用戶注冊(cè)按鈕,進(jìn)入由簡書提供的注冊(cè)頁面,進(jìn)行用戶名密碼驗(yàn)證和設(shè)置


簡書注冊(cè).jpg

然后再回到簡書提供的登陸頁面,輸入剛注冊(cè)的用戶名和密碼進(jìn)行登陸

缺點(diǎn)(站在用戶的角度):

  • 除非我很想使用該app,否則根本不想花這么多時(shí)間進(jìn)行注冊(cè),太麻煩了。

  • 如果使用app很多,到處注冊(cè),密碼要么一樣,要么多到你記不住

  • 每次登陸還要手動(dòng)輸入用戶名以及密碼,也是很麻煩的事情

優(yōu)點(diǎn)(站在app提供者的角度):

  • 對(duì)app提供者來說,新客戶注冊(cè)對(duì)其吸引投資,增加市值,加強(qiáng)影響力是有非常大的幫助。

那么有什么好的方法,能夠避免掉用戶注冊(cè)登陸的不便之處呢?

答案就是: 利用各個(gè)社交app(例如微信)現(xiàn)有的注冊(cè)賬號(hào)進(jìn)行第三方(例如簡書)應(yīng)用的驗(yàn)證授權(quán)登陸,這就是傳說中的oauth2.0授權(quán)登陸。

之所以使用社交軟件賬號(hào)是因?yàn)橛脩魧?shí)在是夠多啊!作為國人,大家基本上都有微信,qq等賬號(hào)。這樣就只要點(diǎn)擊一下簡書登陸頁面中的社交賬號(hào)直接登陸中某個(gè)圖標(biāo)就直接進(jìn)入由社交app提供的授權(quán)頁面

2) oauth2.0授權(quán)登陸:


簡書通過oauth2.0授權(quán)登陸.jpg

上圖顯示了簡書使用微信/qq/豆瓣/新浪微博進(jìn)行oauth2.0授權(quán)登陸的界面,該界面并不是由簡書提供的,而是由對(duì)應(yīng)的各個(gè)社交app提供的

上面四個(gè)界面中,微信登陸只要按確認(rèn)登陸就能登陸簡書app(不要注冊(cè),不要填寫用戶名+密碼,只要點(diǎn)擊確認(rèn)登陸就能登陸簡書。甚至可以通過靜默授權(quán),連這個(gè)頁面都不需要顯示就直接進(jìn)入簡書)。

其他的三個(gè)界面還是需要輸入對(duì)應(yīng)社交app的用戶名+密碼。這是因?yàn)槲抑淮蜷_了微信app,qq沒開,至于豆瓣以及新浪微博,我還沒有賬號(hào)。

3) 以簡書為例子,來簡單說明oauth2.0授權(quán)登陸流程:

什么是oatuh2.0協(xié)議:

  • OAuth2.0(開放授權(quán))是一個(gè)開放標(biāo)準(zhǔn)。
    沒啥好解釋的,就是一個(gè)標(biāo)準(zhǔn)

  • 允許第三方網(wǎng)站用戶授權(quán)的前提下訪問在用戶服務(wù)商那里存儲(chǔ)的各種信息。
    蘊(yùn)含很多信息哦!
    這句話提到了三個(gè)角色:第三方網(wǎng)站/用戶/服務(wù)商
    這句話是站在服務(wù)商的角度進(jìn)行描述的。
    服務(wù)商:以微信為例子,那么服務(wù)商就是微信[服務(wù)器]或騰訊
    用戶
    : 就是的相關(guān)信息(例如用戶名/密碼/性別/ 省份等等等等)都是存放在服務(wù)商的服務(wù)器中。注意:你不是第三方(例如簡書)的用戶,而是微信的用戶(因?yàn)槟闶亲?cè)在微信中,而不是簡書中)
    第三方網(wǎng)站 : 這里指的就是簡書[服務(wù)器]

  • 而這種授權(quán)無需將用戶提供用戶名和密碼提供給該第三方網(wǎng)站
    這句話的意思很明顯,就是簡書服務(wù)器是沒法拿到微信服務(wù)器中的用戶名和密碼的,但是的確能夠讓登陸簡書服務(wù)器

  • 既然第三方(簡書)無法拿到你的用戶名和密碼,那肯定是由服務(wù)商(微信)來進(jìn)行驗(yàn)證,那么第三方肯定要和服務(wù)商有一種機(jī)制來進(jìn)行辨識(shí):
    在認(rèn)證過程之前,第三方(簡書)需要先向服務(wù)商(微信)申請(qǐng)第三方(簡書)服務(wù)的唯一標(biāo)識(shí)
    因此第三方(簡書)填寫本公司相關(guān)信息,提供本公司賬號(hào),域名等信息,并且花三百塊錢給服務(wù)商(騰訊)進(jìn)行審核。服務(wù)商騰訊收到錢,并且審核通過后,會(huì)給第三方(簡書)兩個(gè)編號(hào):AppID和appSecret(及其重要,不能泄露)。通過這兩個(gè)編號(hào),就能確認(rèn)唯一性了。當(dāng)然過程是很復(fù)雜的。


appID.png
  • 第三方[服務(wù)器]服務(wù)商[服務(wù)器]之間的通信:
    既然第三方(簡書)用通過服務(wù)商(微信)來驗(yàn)證用戶(你)身份的合法性,那么肯定涉及到:一旦服務(wù)商(微信)確認(rèn)用戶(你)的合法身份后,如何將信息傳遞給第三方(簡書)
    很簡單,通過第三方(簡書服務(wù)器)提供的回調(diào)URL,服務(wù)商(微信服務(wù)器)將相關(guān)數(shù)據(jù)以參數(shù)形式寫入到第三方(簡書服務(wù)器)提供的回調(diào)URL,第三方(簡書服務(wù)器)解析服務(wù)商(微信服務(wù)器)發(fā)過來的信息抽取出來就OK了!
    那在微信公眾號(hào)的申請(qǐng)中,有要求第三方(簡書)提供回調(diào)地址

微信oauth2.0網(wǎng)頁授權(quán)回調(diào)地址設(shè)定.png
不是這個(gè)頁面中的回調(diào)地址.png

oauth2.0授權(quán)流程:


oauth2.0授權(quán)流程時(shí)序圖.png

其中:
2--7步驟是通過簡書調(diào)用:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
這個(gè)API進(jìn)行的,具體參數(shù)請(qǐng)參見文檔說明

8-9步驟是通過簡書調(diào)用:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
這個(gè)API進(jìn)行的,具體參數(shù)請(qǐng)參見文檔說明

步驟10以后,是通過accesstoken以及openid等從微信獲取相關(guān)信息了

由于微信的開發(fā)需要審批,獨(dú)立的域名(不能使用localhost),并且要求是80端口(http)或443端口(https),這獨(dú)立域名以及這兩個(gè)端口需要工信部審批后才可使用,因此我這里目前沒有這種開發(fā)環(huán)境,但是我可以提供一段代碼,以前分享在群里面,用于進(jìn)行微信oauth2.0授權(quán),我以前可以獲取正確的結(jié)果,目前應(yīng)該也可以。
只是例子而已,不要使用在生產(chǎn)環(huán)境:

由于使用nodejs的wechat-oauth庫進(jìn)行微信oauth2.0授權(quán)操作
因此可以先npm install wechat-oauth --save下載到你的開發(fā)包中去
順便說一下,wechat-oauth是由深入淺出nodejs作者樸靈撰寫的庫

通過微信授權(quán)獲取openid和accesstoken示例代碼:

//1、引入wechat-oauth包 var OAuth = require('wechat-oauth');//2、生成一個(gè)OAuth的實(shí)例,appId和appSecert作為構(gòu)造參數(shù) var oauthApi = new OAuth(你的appId, 你的appSecert); //3、構(gòu)造一個(gè)路由,用于獲取微信寫入到你的回調(diào)url中的code數(shù)據(jù) //這個(gè)路由就是你注冊(cè)在微信開發(fā)中的回調(diào)url!!!! //此時(shí)的你充當(dāng)?shù)氖堑谌骄W(wǎng)站角色,相當(dāng)于簡書服務(wù)器 app.get('/callback', function (req, res) { console.log('----weixin callback -----')var code = req.query.code;console.log("code =" + code);//通過code獲取accesstokenoauthApi.getAccessToken(code, function (err, result){//如果函數(shù)調(diào)用成功,會(huì)在result中得到access_tokenvar accessToken = result.data.access_token;//以及openid;var openid = result.data.openid; console.log('openid='+ openid);//然后通過openid獲取用戶信息 oauthApi.getUser(openid, function (err, result1) {console.log('use weixin api get user: ' + err)console.log(result)var oauth_user = result1;//打印出用戶信息console.log("userinfo" + JSON.stringify(oauth_user, null, ' '));//授權(quán)成功獲取信息后,重定向到你要去的頁面//這里隨便,所以直接重定向到首頁了,你可以換成其他任何頁面 res.redirect('/');});console.log("blf write" + JSON.stringify(result.data, null, ' '));});});
demo的域名.png //url就是3、中定義的路由一致,用來接收微信發(fā)過來的code //關(guān)鍵點(diǎn): callbackURL必須要和3、中定義的路由一致!!! // 且callbackURL就是你在微信中提供的回調(diào)url!!! //就是上圖顯示的url!!!var callbackURL = 'http://你的域名/callback';//oauth2是你定義的路由,當(dāng)你點(diǎn)擊微信登陸這個(gè)按鈕時(shí),就調(diào)用oauth2這個(gè)路由,向騰訊請(qǐng)求oauth2授權(quán)驗(yàn)證//騰訊驗(yàn)證通過,會(huì)將code寫入到3、這個(gè)回調(diào)url中//然后通過3、路由,獲取code, 換取accesstoken以及openid//再通過openid獲取userInfo,漂亮,完成整個(gè)操作app.get('/oauth2', function(req, res) {var url = oauthApi.getAuthorizeURL(callbackURL,'','snsapi_base');console.log(url);//重定向的回調(diào)地址,獲取code,通過code換取openid和accesstoken ,通過openid獲取用戶信息//所有一起如此簡單 res.redirect(url); })

用到了wechat-oauth庫中的三個(gè)api:

oauthApi.getAuthorizeURL

相當(dāng)于2--7步驟是通過調(diào)用:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
還是貼一下該函數(shù)的源碼吧,這樣就清晰了

/*** 獲取授權(quán)頁面的URL地址* @param {String} redirect 授權(quán)后要跳轉(zhuǎn)的地址* @param {String} state 開發(fā)者可提供的數(shù)據(jù)* @param {String} scope 作用范圍,值為snsapi_userinfo和snsapi_base,前者用于彈出,后者用于跳轉(zhuǎn)*/ OAuth.prototype.getAuthorizeURL = function (redirect, state, scope) {var url = 'https://open.weixin.qq.com/connect/oauth2/authorize';var info = {appid: this.appid,redirect_uri: redirect,response_type: 'code',scope: scope || 'snsapi_base',state: state || ''};//合成授權(quán)請(qǐng)求url//然后第三方網(wǎng)站(你)重定向到這個(gè)url中去//其結(jié)果就是調(diào)用callback路由//于是就運(yùn)行你在callback中的代碼了//流程銜接起來了return url + '?' + querystring.stringify(info) + '#wechat_redirect'; };

oauthApi.getAccessToken

相當(dāng)于8-9步驟是通過調(diào)用:https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

OAuth.prototype.getAccessToken = function (code, callback) {var url = 'https://api.weixin.qq.com/sns/oauth2/access_token';var info = {appid: this.appid,secret: this.appsecret,code: code,grant_type: 'authorization_code'};var args = {data: info,dataType: 'json'};//請(qǐng)求url,通過code換取accesstoken,openid等等this.request(url, args, wrapper(processToken(this, callback))); };

oauthApi.getUser

相當(dāng)于步驟10以后,是通過accesstoken以及openid等從微信獲取相關(guān)信息了

希望上面代碼對(duì)大家有幫助

4) 下一步計(jì)劃:

由于微信的授權(quán)我這里沒有環(huán)境(其實(shí)國內(nèi)的環(huán)境導(dǎo)致都需要獨(dú)立域名以及80/443端口問題),因此想實(shí)現(xiàn)一個(gè)類似騰訊的oauth2.0授權(quán)服務(wù)器。目前完成70%,還有一些問題需要解決。

[開發(fā)周記2017/3/26-2017/4/2]
(http://www.jianshu.com/p/7417e20b74d6)

中有記錄,使用了node-oauth2-server庫開發(fā)oauth2.0服務(wù)器,但是登陸驗(yàn)證的話,要使用passport,需要自己寫一個(gè)passport-strategy插件,這個(gè)有點(diǎn)麻煩。目前我需要向前推進(jìn),所以自己的oauth2.0授權(quán)和passport驗(yàn)證放在以后實(shí)現(xiàn)(我覺得大概也不需要多久).

其實(shí)我的需求如下:
1、使用IBM loopback庫實(shí)現(xiàn)服務(wù)器
2、可以使用localhost:非80端口 進(jìn)行oauth2.0授權(quán)回調(diào),不需要獨(dú)立域名以及80/443端口
3、國內(nèi)可以進(jìn)行訪問,不需要那個(gè)啥(facebook/google可以使用localhost,并且非80/443端口,但是不那個(gè)啥就沒法訪問)

通過實(shí)驗(yàn),突然發(fā)現(xiàn)一個(gè)滿足上述所有要求的網(wǎng)站:
偉大的github,可以使用github開發(fā)賬戶,以localhost方式接受github發(fā)送過來的code,換取accesstoken等,進(jìn)行oatuh2.0授權(quán)。
下一步我們就實(shí)戰(zhàn),通過本地調(diào)用來實(shí)現(xiàn)github oauth2.0授權(quán)。

我們會(huì)使用loopback庫以及l(fā)oopback-component-passport插件來演示一個(gè)Demo,大家會(huì)看到根本需要寫一句代碼,就能完美的進(jìn)行oauth2.0授權(quán)!

IBM loopback非常好用,我會(huì)用loopback實(shí)現(xiàn)一個(gè)完整的服務(wù)器,與大家分享。

作為oauth2.0最后一部,我會(huì)使用node-oauth2-server以及passport實(shí)現(xiàn)自己的oauth2.0服務(wù)器,與大家分享實(shí)現(xiàn)的過程,以及node-oauth2-server(上個(gè)禮拜已經(jīng)注釋好了)和passport(曾經(jīng)讀過源碼,但是是去年,可能需要回憶一下,哈哈)的源碼分析

使用loopback-component-passport插件實(shí)現(xiàn)github和facebook登陸成功的圖片:


github_oauth2_授權(quán)成功后的返回?cái)?shù)據(jù).png
fb_oauth2授權(quán).jpg
通過fb賬號(hào)登陸local服務(wù)器.jpg

作者:隨風(fēng)而行之青衫磊落險(xiǎn)峰行
鏈接:http://www.jianshu.com/p/1c48ec65936b
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

總結(jié)

以上是生活随笔為你收集整理的OAuth2.0实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。