Sign in With Facebook&Instagram之服務(wù)端驗證

前言

繼關(guān)于服務(wù)端如何接入Apple, Google 的第三方登錄之后,這里介紹在整合FacebookInstagram 的第三方登錄時服務(wù)端的驗證工作。

Facebook

Facebook的登錄驗證與Google相似谆沃,同樣是驗證客戶端通過登錄請求獲取到的登錄token是否有效。

根據(jù)官方文檔 顯示误墓,F(xiàn)acebook的身份驗證有兩種方式:

  1. 通過code交換access_token,然后用獲取的access_token訪問API驗證客戶端傳來的登錄token是否有效益缎。服務(wù)端收到客戶端傳來的code后谜慌,通過Facebook的API( https://graph.facebook.com/v9.0/oauth/access_token )交換訪問口令,即access_token莺奔。最后調(diào)用API( https://graph.facebook.com/debug_token?input_token={token-to-inspect}&access_token={app-token-or-admin-token} )驗證登錄token是否有效欣范。
  var (
        clientId     = "your clientId"
        clientSecret = "your clientSecret"
        code         = "your code"
        redirectUri  = "your redirectUri"
        url          = fmt.Sprintf("https://graph.facebook.com/v9.0/oauth/access_token?client_id=%s&redirect_uri=%s&client_secret=%s&code=%s", clientId, redirectUri, clientSecret, code)
  )
        
      response, err := http.Get(url)
      handleResponse(response)
      handleErr(err)

API返回的結(jié)果:

  {
    "access_token": {訪問口令}, 
    "token_type": {type},
    "expires_in":  {還有多久過期, 單位: 秒}
}
var (
        accessToken = "get from above"
        token = "your token"
)
        
        response, err := http.Get(fmt.Sprintf("https://graph.facebook.com/debug_token?input_token=%s&access_token=%s", token, accessToken))
        handleResponse(response)
        handleErr(err)
  1. token API

客戶端授權(quán)并取得Facebook返回的登錄token后,將token傳給服務(wù)端令哟,服務(wù)端通過API: https://graph.facebook.com/debug_token?input_token={token-to-inspect}&access_token={app-token-or-admin-token}

其中input_token為客戶端傳過來的登錄token恼琼,access_token為API訪問口令,注意這里的access_token不是通過API獲取的屏富,而是client_id|client_secret

var (
        clientId     = "your clientId"
        clientSecret = "your clientSecret"
        token        = "your token"
        url          = fmt.Sprintf("https://graph.facebook.com/debug_token?input_token=%s&access_token=%s|%s", token, clientId, clientSecret)
)
    
      response, err := http.Get(url)
      handleResponse(response)
      handleErr(err)

具體是code還是token API晴竞,取決于客戶端在用戶點擊登錄按鈕時,客戶端發(fā)起請求中response_type的值狠半。根據(jù)官網(wǎng)顯示噩死,response_type的值包括:

解釋
code 響應(yīng)數(shù)據(jù)作為網(wǎng)址參數(shù)納入,且包含 code 參數(shù)(每個登錄請求獨有的加密字符串)神年。如果未指定此參數(shù)已维,這便是默認行為。當服務(wù)器處理口令時已日,這尤其有用
token 響應(yīng)數(shù)據(jù)作為網(wǎng)址片段納入垛耳,且包含訪問口令。桌面應(yīng)用必須為 response_type 選用此設(shè)置飘千。當客戶端處理口令時堂鲜,這尤其有用
code%20token 響應(yīng)數(shù)據(jù)作為網(wǎng)址片段納入,且包含訪問口令和 code 參數(shù)
granted_scopes 返回用戶在登錄時授予應(yīng)用的所有權(quán)限的逗號分隔列表占婉∨葑欤可與其他 response_type 值合并甫恩。與 token 合并時逆济,響應(yīng)數(shù)據(jù)作為網(wǎng)址片段納入;與其他值合并時,響應(yīng)數(shù)據(jù)則作為網(wǎng)址參數(shù)納入奖慌。

token驗證API返回的結(jié)構(gòu)為:

{
    "data": {
        "app_id": 138483919580948,  //應(yīng)用ID抛虫,等于client_id
        "type": "USER", 
        "application": "Social Cafe", 
        "expires_at": 1352419328, //token過期時間
        "is_valid": true,  //是否有效
        "issued_at": 1347235328, //什么時候簽發(fā)的
        "metadata": {
            "sso": "iphone-safari"
        }, 
        "scopes": [ //權(quán)限范圍
            "email", 
            "publish_actions"
        ], 
        "user_id": "1207059" //用戶在該應(yīng)用下的唯一ID,類似于微信的OpenID
    }
}

最后如果需要服務(wù)器自己獲取用戶的頭像简僧、昵稱建椰、性別等信息,需要服務(wù)端通過前面獲取到的access_token自己去調(diào)用Facebook對應(yīng)的API:

API: https://graph.facebook.com/{facebook_user_id}?fields=name,picture&access_token={access_token}

其中fields字段根據(jù)自己的需求填寫岛马,用,分隔棉姐,具體參考官方文檔

Instagram

根據(jù)Instagram官方文檔 顯示,Instagram不推薦使用Instagram作為身份驗證解決方案啦逆,其推薦使用Facebook登錄, 但是為了調(diào)用Instagram的圖譜API,需要開發(fā)者完成如下準備工作:

  1. Instagram Business 帳戶Instagram 創(chuàng)作者帳戶
  2. 與該帳戶相關(guān)聯(lián)的 Facebook 公共主頁
  3. 一個 Facebook 開發(fā)者帳戶伞矩,可在公共主頁上執(zhí)行任務(wù)
  4. 已注冊的 Facebook 應(yīng)用 ,且已配置基本設(shè)置

這里介紹如果通過Instagram 圖譜 API 獲取Instagram的訪問口令以及用戶信息

客戶端在App內(nèi)集成Instagram授權(quán)窗口后夏志,在用戶授權(quán)后客戶端將獲取授權(quán)碼乃坤,并將其傳給服務(wù)端,然后客戶端使用該授權(quán)碼來換取訪問口令(access_token)沟蔑。

這里需要注意的是湿诊,Instagram返回的授權(quán)碼包含了后綴#_,所以使用時需要將#_去掉才是真正的授權(quán)碼

交換訪問口令的API: https://api.instagram.com/oauth/access_token, 需要的參數(shù)有:

參數(shù)名 參數(shù)值
client_id Instagram應(yīng)用ID
client_secret 應(yīng)用密鑰
redirect_uri Instagram后臺配置的用戶授權(quán)后的重定向URI
grant_type 固定值: authorization_code
code 授權(quán)碼(注意去掉#_后綴)
tokenParam := fmt.Sprintf("client_id=%s&client_secret=%s&grant_type=authorization_code&redirect_uri=%s&code=%s", clientId, clientSecret, redirectUri, code)
response, err := http.Post(tokenUrl, "application/x-www-form-urlencoded", strings.NewReader(tokenParam))
if err != nil {
    panic(err)
}
if response.StatusCode != http.StatusOK {
    panic(err)
}

返回的結(jié)果格式為:

{ 
  "access_token": "IGQVJ...", //訪問口令 
  "user_id": 17841405793187218  //Instagram 應(yīng)用中用戶的唯一ID瘦材,類似于微信的OpenID
}

最后使用API: https://graph.instagram.com/{instagram_user_id}?fields=username&access_token={access_token} 查詢用戶節(jié)點厅须,其中fields字段參考用戶節(jié)點文檔

參考資料

Facebook登錄
手動構(gòu)建登錄流程
Facebook User
Instagram官方文檔
Instagram 圖譜 API
Instagram 用戶節(jié)點文檔

原文鏈接

Sign in With Facebook&Instagram之服務(wù)端驗證

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市食棕,隨后出現(xiàn)的幾起案子九杂,更是在濱河造成了極大的恐慌,老刑警劉巖宣蠕,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件例隆,死亡現(xiàn)場離奇詭異,居然都是意外死亡抢蚀,警方通過查閱死者的電腦和手機镀层,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來皿曲,“玉大人唱逢,你說我怎么就攤上這事∥菪荩” “怎么了坞古?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長劫樟。 經(jīng)常有香客問我痪枫,道長织堂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任奶陈,我火速辦了婚禮易阳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吃粒。我一直安慰自己潦俺,他們只是感情好,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布徐勃。 她就那樣靜靜地躺著事示,像睡著了一般。 火紅的嫁衣襯著肌膚如雪僻肖。 梳的紋絲不亂的頭發(fā)上很魂,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音檐涝,去河邊找鬼遏匆。 笑死,一個胖子當著我的面吹牛谁榜,可吹牛的內(nèi)容都是我干的幅聘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼窃植,長吁一口氣:“原來是場噩夢啊……” “哼帝蒿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起巷怜,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤葛超,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后延塑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绣张,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年关带,在試婚紗的時候發(fā)現(xiàn)自己被綠了侥涵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡宋雏,死狀恐怖芜飘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情磨总,我是刑警寧澤嗦明,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站蚪燕,受9級特大地震影響娶牌,放射性物質(zhì)發(fā)生泄漏奔浅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一裙戏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧厕诡,春花似錦累榜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寿羞,卻和暖如春猖凛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绪穆。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工辨泳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人玖院。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓菠红,卻偏偏與公主長得像,于是被迫代替她去往敵國和親难菌。 傳聞我的和親對象是個殘疾皇子试溯,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

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