Sign in With Facebook&Instagram之服务端验证

前言

继关于服务端如何接入Apple, Google 的第三方登录之后,这里介绍在整合FacebookInstagram 的第三方登录时服务端的验证工作。

Facebook

Facebook的登录验证与Google相似,同样是验证客户端通过登录请求获取到的登录token是否有效。

根据官方文档 显示,Facebook的身份验证有两种方式:

  1. 通过code交换access_token,然后用获取的access_token访问API验证客户端传来的登录token是否有效。服务端收到客户端传来的code后,通过Facebook的API( https://graph.facebook.com/v9.0/oauth/access_token )交换访问口令,即access_token。最后调用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返回的结果:

  {
    "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

客户端授权并取得Facebook返回的登录token后,将token传给服务端,服务端通过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,取决于客户端在用户点击登录按钮时,客户端发起请求中response_type的值。根据官网显示,response_type的值包括:

解释
code 响应数据作为网址参数纳入,且包含 code 参数(每个登录请求独有的加密字符串)。如果未指定此参数,这便是默认行为。当服务器处理口令时,这尤其有用
token 响应数据作为网址片段纳入,且包含访问口令。桌面应用必须为 response_type 选用此设置。当客户端处理口令时,这尤其有用
code%20token 响应数据作为网址片段纳入,且包含访问口令和 code 参数
granted_scopes 返回用户在登录时授予应用的所有权限的逗号分隔列表。可与其他 response_type 值合并。与 token 合并时,响应数据作为网址片段纳入;与其他值合并时,响应数据则作为网址参数纳入。

token验证API返回的结构为:

{
    "data": {
        "app_id": 138483919580948,  //应用ID,等于client_id
        "type": "USER", 
        "application": "Social Cafe", 
        "expires_at": 1352419328, //token过期时间
        "is_valid": true,  //是否有效
        "issued_at": 1347235328, //什么时候签发的
        "metadata": {
            "sso": "iphone-safari"
        }, 
        "scopes": [ //权限范围
            "email", 
            "publish_actions"
        ], 
        "user_id": "1207059" //用户在该应用下的唯一ID,类似于微信的OpenID
    }
}

最后如果需要服务器自己获取用户的头像、昵称、性别等信息,需要服务端通过前面获取到的access_token自己去调用Facebook对应的API:

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

其中fields字段根据自己的需求填写,用,分隔,具体参考官方文档

Instagram

根据Instagram官方文档 显示,Instagram不推荐使用Instagram作为身份验证解决方案,其推荐使用Facebook登录, 但是为了调用Instagram的图谱API,需要开发者完成如下准备工作:

  1. Instagram Business 帐户Instagram 创作者帐户
  2. 与该帐户相关联的 Facebook 公共主页
  3. 一个 Facebook 开发者帐户,可在公共主页上执行任务
  4. 已注册的 Facebook 应用 ,且已配置基本设置

这里介绍如果通过Instagram 图谱 API 获取Instagram的访问口令以及用户信息

客户端在App内集成Instagram授权窗口后,在用户授权后客户端将获取授权码,并将其传给服务端,然后客户端使用该授权码来换取访问口令(access_token)。

这里需要注意的是,Instagram返回的授权码包含了后缀#_,所以使用时需要将#_去掉才是真正的授权码

交换访问口令的API: https://api.instagram.com/oauth/access_token, 需要的参数有:

参数名 参数值
client_id Instagram应用ID
client_secret 应用密钥
redirect_uri Instagram后台配置的用户授权后的重定向URI
grant_type 固定值: authorization_code
code 授权码(注意去掉#_后缀)
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)
}

返回的结果格式为:

{ 
  "access_token": "IGQVJ...", //访问口令 
  "user_id": 17841405793187218  //Instagram 应用中用户的唯一ID,类似于微信的OpenID
}

最后使用API: https://graph.instagram.com/{instagram_user_id}?fields=username&access_token={access_token} 查询用户节点,其中fields字段参考用户节点文档

参考资料

Facebook登录
手动构建登录流程
Facebook User
Instagram官方文档
Instagram 图谱 API
Instagram 用户节点文档

原文链接

Sign in With Facebook&Instagram之服务端验证

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容