第三方登錄對(duì)接(一)

這里對(duì)接的是自己公司的 open 平臺(tái),但是會(huì)開放到外部供其它公司調(diào)用劫哼。所以授權(quán)服務(wù)器是 open 平臺(tái)皂吮,下面授權(quán)服務(wù)器將統(tǒng)一稱為平臺(tái)服務(wù)器。
使用的是 Auth2.0 的標(biāo)準(zhǔn)(授權(quán)碼模式)脑奠,和微信一致,所以其實(shí)本質(zhì)上是通用的幅慌,Auth2.0 介紹可以直接看這里宋欺,這篇已經(jīng)講得很通俗易懂,所以本文不再贅述胰伍。
項(xiàng)目是采取前后端分離的方式齿诞,前端主要是 vue+node,node 作為中間件骂租,后端是 golang祷杈。
以下的代碼都是代碼段,把最關(guān)鍵的部分抽出來了渗饮,雖然不是完整的代碼但汞,但是已經(jīng)足夠能說明了宿刮。

現(xiàn)在講一下步驟(每步之前都先介紹參數(shù)含義):

第一步:申請(qǐng)權(quán)限

別誤會(huì),這里的申請(qǐng)權(quán)限并不是直接申請(qǐng)就能直接請(qǐng)求用戶授權(quán)信息了私蕾,這里是為了去平臺(tái)申請(qǐng)一個(gè)唯一的ID(client_id)和秘鑰(client_secret)以及授權(quán)回調(diào)域名(同微信端的 AppID 和 appsecret 以及授權(quán)回調(diào)域名)僵缺,回調(diào)域名要在平臺(tái)的白名單當(dāng)中,這個(gè)回調(diào)域名通常是自己的應(yīng)用的域名踩叭。

第二步:獲取 code

拿到 client_id 后就可以去獲取 code 了磕潮,先進(jìn)行參數(shù)說明
client_id:客戶端 ID (等同于微信中的 AppID,也就是自己的應(yīng)用在對(duì)接平臺(tái)中的唯一 ID)
redirect_uri: 重定向地址容贝,即獲取到 code 以后要跳轉(zhuǎn)的地址自脯,該地址必須在平臺(tái)的白名單中,需要用 encodeURIComponent 進(jìn)行編碼嗤疯。
scope:授權(quán)范圍冤今,也就是用戶允許平臺(tái)服務(wù)器授權(quán)給自己應(yīng)用的范圍(同微信 scope,如果需要被授權(quán)獲取到用戶信息則設(shè)置為
snsapi_userinfo茂缚,每個(gè)平臺(tái)設(shè)置的應(yīng)該都不一樣)戏罢。
response_type: 返回類型,固定為 code
state:可以帶上一些狀態(tài)脚囊,平臺(tái)服務(wù)器到時(shí)候會(huì)原樣返回
我們需要根據(jù)以上多個(gè)參數(shù)獲取 code(授權(quán)碼)龟糕,具體需要哪些參數(shù)要看不同的平臺(tái)的規(guī)定,但是基本上會(huì)包含上述五個(gè)悔耘,讲岁,其中 client_id 是對(duì)接的平臺(tái)為自己的應(yīng)用分配的。redirect_uri 不是隨便寫的衬以,而是應(yīng)該要能跳轉(zhuǎn)到的地址可以發(fā)起下一步的請(qǐng)求缓艳,并且可以帶上額外的參數(shù),具體后面再說看峻。
現(xiàn)在假設(shè)參數(shù)為

    client_id = 'app01',
    redirect_uri = 'http://abc.demo.com/callback',
    scope = 'userinfo',
    response_type = 'code',
    state = 'abcabc',

則訪問鏈接為 https://m.open.com/oauth2/authorize?client_id=ABC&redirect_uri=http%3A%2F%2Fabc.demo.com%2Fcallback&scope=userinfo&response_type=code&state=abcabc
完整代碼為

import querystring from 'querystring'
exports.connect = async function(ctx) {
    let url = https://m.open.com/oauth2/authorize'  
    let info= {
        client_id: 'ABC',
        redirect_uri: 'http://abc.demo.com/callback', // 注意這里的 http:// 不可以省
        scope: 'userinfo',
        response_type: 'code',
        state: 'abcabc',
  }
  const finalUrl =  url + '?' + querystring.stringify(info)
  await ctx.redirect(finalUrl)
}

可以設(shè)置任意 api阶淘,指定執(zhí)行該 connect 的函數(shù)以發(fā)起請(qǐng)求。比如:

import Router from 'koa-router'
import connect from './connect'
router.get('/open/connect', connect)

在請(qǐng)求了 /open/connect 這個(gè) api 后互妓,會(huì)調(diào)用 connect 函數(shù)去跳轉(zhuǎn)獲取 code溪窒,如果成功的話,平臺(tái)服務(wù)器則會(huì)返回你給定的重定向地址:
http://abc.demo.com/callback?code=zzaabb&state=abcabc
拿到 code 后第一步就算結(jié)束了冯勉。

第三步:獲取 access_token

剛才第一步結(jié)束時(shí)澈蚌,平臺(tái)的服務(wù)器直接返回了鏈接為 http://abc.demo.com/callback?code=zzaabb&state=abcabc,其中 http://abc.demo.com 為自己應(yīng)用的域名灼狰,callback 為路由地址宛瞄,對(duì)應(yīng)的函數(shù)將要執(zhí)行下一步。
這里可以用 node 去處理交胚,也可以用 golang 處理份汗。先講一下 node 處理的方式伐厌。
grant_type: 固定為 authorization_code
client_id:客戶端 ID
client_secret:客戶端被平臺(tái)分配的秘鑰(等同于微信中的 secret 參數(shù)名,值為公眾號(hào)的appsecret)
code:剛剛獲取的授權(quán)碼裸影,通常使用一次就會(huì)失效
代碼如下:

import  axios from 'axios'

exports.callback = async function(ctx) {
    let { code } = ctx.query
   let { access_token, expires_in } = await   
    axios.post(`https://m.open.com/oauth2/access_token`, {
        grant_type: 'authorization_code',
        client_id: 'app01',
        client_secret: 'imsecret01',
        code: 'zzaabb'
      });
  
}

可以看到這里是 node 端直接對(duì)平臺(tái)服務(wù)器發(fā)起了請(qǐng),獲取到了 access_token 和 expires_in军熏,這個(gè) expires_in 是 access_token 有效時(shí)間轩猩。

第四步

獲取到了 access_token 以后,授權(quán)才結(jié)束荡澎。這時(shí)才能用 access_token 去正式請(qǐng)求平臺(tái)服務(wù)器獲取用戶信息均践。這個(gè) access_token 可以存儲(chǔ)到 session 當(dāng)中,比如 redis 里摩幔。這樣獲取用戶信息的時(shí)候就不需要每次都重新去獲取授權(quán)彤委,用戶體驗(yàn)也不好。但是這里需要特別注意一個(gè)地方或衡,就是任意用戶都能發(fā)起請(qǐng)求去直接請(qǐng)求到任意用戶的信息焦影,所以這里如果要存儲(chǔ)到 redis 的話,需要對(duì)前端發(fā)起的請(qǐng)求進(jìn)行校驗(yàn)封断,校驗(yàn)通過以后才能去數(shù)據(jù)庫拿到 access_token斯辰。但是因?yàn)檫@里的 node 不作為真正的后端去使用,所以以下只是演示坡疼,真正使用 golang 做的對(duì)接后面會(huì)寫到彬呻。
access_token:調(diào)用用戶信息的憑證,只有拿到這個(gè)參數(shù)才能去獲取到用戶信息柄瑰。
下面根據(jù)拿到的 access_token 獲取用戶信息:

  import axios from 'axios'
 exports.getUser = async function(ctx) {
   let user = await axios.get(`https://m.open.com/user`, {
        params: {
          access_token,
          },
    })
}

通常一篇文章特別長(zhǎng)闸氮,看下來比較容易沒耐心,所以 golang 對(duì)接的步驟將在下一篇中再介紹教沾。
今天就暫時(shí)到這里把~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蒲跨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子详囤,更是在濱河造成了極大的恐慌财骨,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藏姐,死亡現(xiàn)場(chǎng)離奇詭異隆箩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)羔杨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門捌臊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人兜材,你說我怎么就攤上這事理澎〕蚜Γ” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵糠爬,是天一觀的道長(zhǎng)寇荧。 經(jīng)常有香客問我,道長(zhǎng)执隧,這世上最難降的妖魔是什么揩抡? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮镀琉,結(jié)果婚禮上峦嗤,老公的妹妹穿的比我還像新娘。我一直安慰自己屋摔,他們只是感情好烁设,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钓试,像睡著了一般装黑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弓熏,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天曹体,我揣著相機(jī)與錄音,去河邊找鬼硝烂。 笑死箕别,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滞谢。 我是一名探鬼主播串稀,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼狮杨!你這毒婦竟也來了母截?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤橄教,失蹤者是張志新(化名)和其女友劉穎清寇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體护蝶,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡华烟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了持灰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盔夜。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喂链,到底是詐尸還是另有隱情返十,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布椭微,位于F島的核電站洞坑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蝇率。R本人自食惡果不足惜检诗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓢剿。 院中可真熱鬧,春花似錦悠轩、人聲如沸间狂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鉴象。三九已至,卻和暖如春何鸡,著一層夾襖步出監(jiān)牢的瞬間纺弊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工骡男, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淆游,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓隔盛,卻偏偏與公主長(zhǎng)得像犹菱,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吮炕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理腊脱,服務(wù)發(fā)現(xiàn),斷路器龙亲,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • 注意:代碼自己動(dòng)手寫陕凹,不要復(fù)制! GitHub 一鳄炉、接入微信第三方登錄準(zhǔn)備工作杜耙。 移動(dòng)應(yīng)用微信登錄是基于OAuth...
    大沖哥閱讀 15,071評(píng)論 0 7
  • # 一度蜜v3.0協(xié)議 --- # 交互協(xié)議 [TOC] ## 協(xié)議說明 ### 請(qǐng)求參數(shù) 下表列出了v3.0版協(xié)...
    c5e350bc5b40閱讀 641評(píng)論 0 0
  • OAuth 2.0 是目前比較流行的做法,它率先被Google, Yahoo, Microsoft, Facebo...
    半夜菊花茶閱讀 14,618評(píng)論 0 12
  • 如果人終有一死拂盯,我們又為什么要這么努力的活著泥技? 尊嚴(yán) 橙汁是我在校妝網(wǎng)認(rèn)識(shí)的同事,我們是同一批進(jìn)入校妝網(wǎng)并且一起參...
    整理師黃婷閱讀 665評(píng)論 5 9