サーバーとの通信に基づいたiPhoneアプリケーションを開発しており、Facebook認証メカニズムを使用したいと考えています。
基本的に、次のように動作するはずです。
私の質問は、与えられたアクセストークンが有効かどうかをサーバーがFacebookに問い合わせる方法です。トークンがFacebookアプリで有効かどうかを何らかの方法で確認する必要があると思います。
私は、APIをグラフ化するために多くのFacebookクエリを試しましたが、期待どおりに機能しませんでした。例を挙げていただけますか?
更新:この回答は安全ではないようですアプリに属していると最初にトークンを検証しないため、コメントを参照してください。元の回答は次のとおりです。
既にアクセストークンを持っていると思います。このような場合、アクセストークンを検証する最も簡単な方法は、次のリクエストを発行することです
https://graph.facebook.com/me?fields=id&access_token=@accesstoken
ここで、@ accesstokenを所有しているアクセストークンに置き換えます。 URLを分類し、それぞれについて説明します。
ここでは、アクセストークンの所有者のFacebookユーザーIDをJSON文字列として返すグラフAPIリクエストを発行しています。キーワード「me」は、現在ログインしているユーザーまたはアクセストークンの所有者を表します。このリクエストでは、アクセストークンは必須パラメーターです。
提供されたアクセストークンが無効または期限切れの場合、Facebookは何らかのエラーメッセージを返します。
有効なアクセストークンの場合、結果は何らかの形で次のようになります。
{
"id": "ID_VALUE"
}
ユーザーアクセストークンがアプリに属していることを検証するために使用できる2段階のプロセスを次に示します。
1)App Accessトークンを生成します
( 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: [ ]
}
}
そのトークンが「あなたのアプリ」からのものでない場合、エラー応答を返します。
別の解決策は、 ユーザーアクセストークンからアプリケーションIDを取得(またはトークンのソースアプリケーションを確認) で説明されているhttps://graph.facebook.com/app/?access_token=[user_access_token]
を使用することです。
これは文書化されていない機能のようですが、トークンが生成されたアプリのIDを含むJSONを返します。トークンがアプリ用ではなかった場合、400を返します。
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"
}
}
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");
}
PHPから GitHub のFacebook SDKをダウンロードできます。
ユーザーが自分のものであると主張するFacebook UIDを渡した場合、それが正当であるかどうかを確認したい場合、これはPython関数で、アクセストークン(Robinの実装ジョームの答え):
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
これは、1つのリクエストのみを使用してユーザートークンを検証する唯一の安全な方法です。
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 (上記の方法はこのセクションの最後に記載されています)