首页 文章

Facebook访问令牌服务器端验证iPhone应用程序

提问于
浏览
108

我正在开发基于与服务器通信的iPhone应用程序,我想使用Facebook身份验证机制 .

基本上,我认为它应该像这样工作:

  • 在我的iPhone应用程序中,用户使用他的电子邮件和密码登录Facebook .

  • 用户可以访问相关Facebook应用程序的数据 .

  • 我的iPhone应用程序在成功登录后收到访问令牌 .

  • 在与我的服务器进一步通信时,我的iPhone应用程序应该使用收到的Facebook访问令牌(例如:在查询中) .

  • 当我的服务器从iPhone应用程序收到一些带有访问令牌的查询时,它应该询问Facebook这个令牌是否有效(以及对谁),如果是,服务器应该假定该用户已通过Facebook验证 .

我的问题是:如果给定的访问令牌有效,服务器应该如何询问Facebook?我想我应该以某种方式检查令牌是否对我的Facebook应用程序有效 .

我已经尝试了很多Facebook查询到图形API,我发现,但没有任何工作像我预期的那样 . 你能举个例子吗?

8 回答

  • 10

    更新:这个答案似乎不安全,因为它不会首先验证令牌属于您的应用程序,请参阅注释,原始答案如下:

    我假设您已经拥有了访问令牌 . 在这种情况下,验证访问令牌的最简单方法是发出以下请求

    https://graph.facebook.com/me?fields=id&access_token=@accesstoken
    

    这里用您拥有的访问令牌替换@accesstoken . 我将细分网址并解释每个网址 .

    我们在此处发出图表api请求,该请求将访问令牌所有者的Facebook用户ID作为JSON字符串返回 . 关键字“me”表示当前登录的用户或访问令牌的所有者 . 对于此请求,访问令牌是必需参数 .

    如果提供的访问令牌无效或过期Facebook将只返回某种错误消息 .

    对于有效的访问令牌,结果将以某种方式看起来像这样

    {
       "id": "ID_VALUE"
    }
    
  • 2

    这是一个两步过程,您可以使用它来验证用户访问令牌是否属于您的应用:

    1) Generate an App Access token

    https://developers.facebook.com/docs/howtos/login/login-as-app/

    https://graph.facebook.com/oauth/access_token?
    client_id=YOUR_APP_ID
    &client_secret=YOUR_APP_SECRET
    &grant_type=client_credentials
    

    2) Debug the User Access token

    https://developers.facebook.com/docs/howtos/login/debugging-access-tokens/

    https://graph.facebook.com/debug_token?
    input_token=INPUT_TOKEN
    &access_token=ACCESS_TOKEN
    

    其中INPUT_TOKEN是您要验证的用户访问令牌,ACCESS_TOKEN是您从步骤1获得的应用程序令牌 .

    调试 endpoints 基本上会转储有关令牌的所有信息,因此它会响应如下:

    {
        data: {
            app_id: YOUR_APP_ID,
            is_valid: true,
            metadata: {
                sso: "iphone-safari"
            },
            application: YOUR_APP_NAMESPACE,
            user_id: USER_ID,
            issued_at: 1366236791,
            expires_at: 1371420791,
            scopes: [ ]
        }
    }
    

    如果该令牌不是来自“您的应用”,那么它将返回错误响应 .

  • 5

    另一种解决方案是使用Get application id from user access token (or verify the source application for a token)所描述的 https://graph.facebook.com/app/?access_token=[user_access_token] .

    这似乎是一个未记录的功能,但返回包含为其生成令牌的应用程序ID的JSON . 如果令牌不适合您的应用,则返回400 .

  • 1

    在最新版本的facebook(2.2)中你可以这样做:

    https://developers.facebook.com/docs/graph-api/reference/v2.2/debug_token

    样本输出:

    {
        "data": {
            "app_id": "THE APP ID", 
            "application": "APP NAME", 
            "expires_at": 1427245200, 
            "is_valid": true, 
            "scopes": [
            "public_profile", 
            "basic_info", 
            "read_stream", 
            "email", 
            "publish_actions", 
            "read_friendlists", 
            "user_birthday", 
            "user_hometown", 
            "user_location", 
            "user_likes", 
            "user_photos", 
            "user_videos", 
            "user_friends", 
            "user_posts"
            ], 
            "user_id": "THE USER ID"
        }
    }
    
  • 1
    private function facebookRequestMe($access_token)
    {
        include_once "facebook.php";
    
        $facebook = new Facebook(array(
            "appId" => "your_application_id",
            "secret" => "your_application_secret"
        ));
        $facebook->setAccessToken($access_token);
        return $facebook->api("/me", "GET");
    }
    

    您可以从GitHub下载适用于PHP的Facebook SDK .

  • 108

    如果用户已经通过了你声称属于他们的Facebook UID并且你想要检查它是否合法,那么这是一个Python函数,它将根据他们的访问令牌验证它(Robin Jome的答案的实现):

    def verify_facebook_id(id, access_token):
        import requests
        import simplejson
        params = {'fields': 'id', 'access_token': access_token}
        text = requests.get("https://graph.facebook.com/me", params=params).text
        json = simplejson.loads(text)
        response_id = json["id"]
        return response_id == id
    
  • 113

    这是仅使用一个请求验证用户令牌的唯一安全方法:

    https://graph.facebook.com/debug_token?input_token={token-to-inspect}&access_token={app_id}|{app_secret}
    

    注意标志“|”在上面的URL中不用作OR而是用作分隔符,填写其他字段后必须在那里 .

    响应将是JSON看起来像这样:

    {
        data: {
            app_id: {app_id},
            application: {app_name},
            expires_at: {some_number},
            is_valid: {true|false}
            scopes: {array_of_permissions},
            user_id: {user_id}
        }
    }
    

    参考:https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens(本节底部提到了上述方法)

  • -1

    除了访问令牌,Facebook还发送“expires_in”参数,该参数是偏移值 . 使用它来计算访问令牌何时作为NSDate到期 . 然后,当您需要执行请求时,将当前日期与到期日期进行比较 .

    还尝试检查Facebook发回的状态代码和响应字符串 .

相关问题