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

时间:2011-03-23 14:35:49

标签: iphone facebook authentication

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

基本上,我认为它应该是这样的:

  1. 在我的iPhone应用程序中,用户使用他的电子邮件和密码登录Facebook。
  2. 用户可以访问相关Facebook应用程序的数据。
  3. 我的iPhone应用程序在成功登录后会收到访问令牌。
  4. 在与我的服务器进行进一步通信时,我的iPhone应用程序应使用收到的Facebook访问令牌(例如:在查询中)。
  5. 当我的服务器从iPhone应用程序收到一些带有访问令牌的查询时,它应该询问Facebook这个令牌是否有效(以及谁),如果是,服务器应该假设用户已通过Facebook验证。
  6. 我的问题是:如果给定的访问令牌有效,服务器应该如何询问Facebook?我想我应该以某种方式检查令牌是否对我的Facebook应用程序有效。

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

8 个答案:

答案 0 :(得分:113)

  

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

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

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

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

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

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

对于有效的访问令牌,结果将以某种方式显示为

{
   "id": "ID_VALUE"
}

答案 1 :(得分:111)

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

1)生成应用访问令牌

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)调试用户访问令牌

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获得的应用程序令牌。

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

{
    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: [ ]
    }
}

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

答案 2 :(得分:11)

另一种解决方案是使用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。

答案 3 :(得分:5)

在最新版本的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"
    }
}

答案 4 :(得分:2)

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。

答案 5 :(得分:1)

如果用户通过了他们认为属于他们的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

答案 6 :(得分:1)

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

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

请注意标志" |"在上面的网址中,我们没有使用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 (上面的方法在本节的底部提到)

答案 7 :(得分:-1)

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

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