Facebook登录服务器端接入

原文 2017-05-07 12:04:52 发表于 CSDN,这里对以前写的文章做下收录。

最近研究了下facebook登陆授权,发现他的API文档真的不尽人意,有点像是新手引导,很多API参数细节都没有说明,都是一笔带过。所以,我这里写了篇文章,专门讲Facebook登录服务器端接入。

验证facebook账号授权

客户端先拉起facebook授权页面,等用户授权登录后,取到玩家的facebook id 和 token,然后将这个id和token传给服务端,服务端再对id和token做验证。
验证的过程是HTTP(s)验证,API如下:
https://graph.facebook.com/debug_token?access_token={App-token}&input_token={User-token}
以上的参数,User-token为用户的token,App-token为APP的token,值为 {Your AppId}%7C{Your AppSecret}。其中,%7C为urlencode的 | 符号
返回数据如下:
{
    "data": {
        "app_id": 000000000000000,
        "expires_at": 1352419328, 
        "is_valid": true, 
        "issued_at": 1347235328, 
        "scopes": [
            "email", 
            "publish_actions"
        ], 
        "user_id": 100207059
    }
}

 

这是一个授权成功的实例,先验证HTTP code=200, 再验证返回json串中 is_valid 为 true,最后对比 user_id 与客户端传来的用户 fb id一致。
facebook 账号id问题
 
id说明
App获得到的账号id,实际上不是用户真正的facebook id,而是facebook账号在该App下的openid,这个openid只适用于本App。这个账号id是一个纯数字的字符串,详细说明如下:
https://developers.facebook.com/docs/graph-api/reference/user
id长度
这里说下这个id长度问题。这点是facebook API文档未曾提及的,最后在facebook的开发者博客找到了。

如果是MySQL,可以用无符号的bigint表示

获取facebook账号个人信息

用户登录授权后,我们还要用户的一些个人数据,如昵称,性别,好友,等。这里就要利用用户的token,继续请求Facebook获取数据。
API如下:
https://graph.facebook.com/{user-id}?access_token={Token}
以上,token可以有两种形式:
1、用户账号token,形式为:{User-token}
2、APP token,形式为:{Your AppID}%7C{Your AppSecret}
第2种方式的前提是,用户授权登录过APP。但其实,这种方式容易触发权限问题,即使是玩家刚授权登录APP。
报错信息如:
Unusual behavior of facebook grap API (“type”: “GraphMethodException”, “code”: 100)
以上这点,facebook也没有做出解释,所以,建议以第1种方式获取fb账号个人数据。

前面这个接口等同于 /me?access_token={User-Token}, 默认只返回 id,name ,如果想要更多用户数据,就要以下面的方式查询了
/{user-id}?fields=id,name,gender,friends&access_token={User-Token},或 /me?fields=id,name,gender,friends&access_token={User-Token}

更多参数参考Facebook API文档, http://developers.facebook.com/docs/reference/api/

 

其他问题

这几天接入新项目,授权验证出现了问题,提示如下:
{"error": {"message":"Invalid OAuth access token.", "type":"OAuthException", "code":190, "fbtrace_id":"AUC6EosTgEA2dJqwhLPjX"}}
 
最后问题定位到,开发者后台提交APP时选错了应用类型

 
按字面提示,容易被引导选了第二项,事实上,要选择第四项,即“其他”项。
 
问题来了,假如是第二种,该如何验证?
 
这个问题是写文章时想到的,我只研究了facebook文档,没做过测试,只提供下思路。
https://developers.facebook.com/docs/games/gaming-services/domain

对于gaming类的登陆,要使用特定的域名,取字段 graph_domain 的值,不可使用 graph.facebook.com,否则会验证失败,提示OAuth exception报错
 
 

2020-12-25 增加授权验证(Invalid OAuth access token)的异常处理

《Facebook登录服务器端接入》上有11条评论

    1. 我使用阿里云的港服、东亚服、美服都可以访问,内地服请求不了。vpn我猜测可能是facebook单方面禁止了,估计是存在安全问题

  1. 博主请问
    error”: {
    “code”: 190,
    “message”: “Invalid OAuth access token.”
    }
    是拼接的Your AppId|Your AppSecret 无效呢?还是用户的token错误呢?

    1. 我遇到这个报错,出现的情况都是用户的token错误,需要用户重新授权进入APP。但如果所有用户都是报这个错,那应该是Your AppId|Your AppSecret 错误,其中|需要转义为%7C

    1. 参考苹果设置vpn的方式,在设置-通用-vpn-添加配置,目前免费的vpn很不稳定,不一定连得上脸书,建议购买商业vpn

    1. 普通用户调用次数应该达不到他的限制,可能全局有限制,减少压力。多重试一次,或者服务器缓存下token,如果半个钟内重复登录则只由服务器处理,不调他的接口

发表评论

邮箱地址不会被公开。 必填项已用*标注