web-dev-qa-db-ja.com

FacebookグラフAPI-OAuthトークン

新しいグラフAPIを使用してデータを取得しようとしていますが、OAuthから取得しているトークンが機能していないようです。

私が行っている電話は次のとおりです。

$token = file_get_contents('https://graph.facebook.com/oauth/access_token?type=client_cred&client_id=<app_id>&client_secret=<app secret>');

これにより、文字列の長さが41のトークンが返されます。返されるものの例を示すために、サンプルの下に提供します(すべての数字を0に、すべて大文字を「A」に、小文字を「a」に変換)

access_token=000000000000|AaaAaaAaaAAaAaaaaAaaAa0aaAA.

このアクセストークンを取得し、それをデータの呼び出し要求に添付します。何も返さないため、正しいトークンではないようです。次のようにデータ呼び出しを行います。

file_get_contents('https://graph.facebook.com/<my_page's_id>/statuses?access_token=000000000000|AaaAaaAaaAAaAaaaaAaaAa0aaAA.')

ブラウザからこのページを直接手動で取得すると、500 /内部サーバーエラーメッセージが表示されます。

どんな援助もありがたいことに感謝します。


更新:

その後、メソッドをfile_get_contents()からcurlに変更しました。ヘッダーを取得すると、次のエラーメッセージが表示されます...

{"error":{"type":"OAuthException","message":"Missing client_id"}}

しかし、私の投稿配列には「client_id」が含まれていますか?!

26
Simon R

Type = client_credを使用しないでください。これは、ユーザーがアプリに使用を許可するアクセストークンではありません。 client_credタイプのアクセストークンを取得するために、redirect_uriやコード、または承認は必要ありません。

Facebookは、現時点でOAuth 2の初期ドラフトを実装しています。したがって、「状態」のサポートはまだありません。

ただし、状態をredirect_uriにサフィックスできるのは素晴らしいことです。ここで注意すべき重要な点は、指定したサイトのURL(redirect_uri)です

持つべきではない

末尾にある疑問符、またはクライアント状態として接尾するもののどこか、エンコードされているかどうかに関係なく。行った場合、恐ろしい「検証コードの検証エラー」が表示されます

そのように使用しないでください

http://www.Redirect.com?

正しいURLは http://www.Redirect.com/ です

それが役に立てば幸い。

24
PrateekSaluja

これは私のために働く:-)

header('Location: https://graph.facebook.com/oauth/access_token?' . http_build_query(array(
    'client_id'     => FB_APP_ID,
    'type'          => 'client_cred',
    'client_secret' => FB_SECRET,
    'code'          => $code)));

もちろん、代わりにfile_get_contentsを使用して、応答からトークンを解析します

16
phpslacker

私はまったく同じ問題に遭遇しましたが、問題はredirect_uriパラメータのエンコーディングではないことがわかりました、または末尾のスラッシュまたは疑問符があったことは、単に2つの異なるリダイレクトURLを渡したことです(仕様を読んでいませんでした時間)。

Redirect_uriは、「コード」トークンを使用して証明書利用者にリダイレクトするために、一度だけ(初めて)リダイレクトとして使用されます。 2回目、redirect_uriは認証サーバーに返されますが、今回は(リダイレクトするために)期待どおりには使用されず、認証サーバーがコードを検証するために使用されます。サーバーはaccess_tokenで応答します。

http://tools.ietf.org/html/draft-ietf-oauth-v2-05#section-3.5.2

Facebookのドキュメント(ひどい)にfetchと書かれていることに気付くでしょう。fetchinghttps://graph.facebook.com/oauth/access_token 。 "

要約すると、Uriをエンコードしたり特別なことをしたりする必要はなく、同じredirect_uriを2回渡して、fetchに2ページ目を渡すだけです。内部にaccess_tokenを取得します。

8

Curlを使用して、ターミナル(OSXユーザー)経由でアクセストークンをリクエストできます。

curl -F type=client_cred -F client_id=xxxxxxxxxxxxxxx -F client_secret=c0f88xxxxxxxxxxxxxxxxxx1b949d1b8 https://graph.facebook.com/oauth/access_token

アクセストークンを取得したら、それを今後のcurlリクエストで使用して、新しいグラフAPIを介して変更を加えることができます。

プロファイルIDにメッセージを投稿します。

curl -F 'access_token=xxxxxxxxxxxxx|mGVx50lxxxxxxxxxxxxhzC2w.'  -F 'message=Hello Likers'  -F 'id=1250000000000905'  https ://graph.facebook.com/feed
6
Volcanic

その点に注意してください

「タイプ」=>「client_cred」、

以下を回避する唯一の方法であると述べたが、上記も動作します

ユーザーがアプリケーションを承認した後、ユーザーを引数コード内の検証文字列で指定したリダイレクトURIにリダイレクトします。これはoauthアクセストークンと交換できます。 https://graph.facebook.com/oauth/access_token を取得してアクセストークンにアクセスするexact前のステップと同じredirect_uriを渡します。

経由: http://developers.facebook.com/docs/api 参照: http://forum.developers.facebook.net/viewtopic.php?pid=238371

3
Martin

たぶんあなたの問題は解決したかもしれませんが、私はまだあなたから受け入れられた答えを見つけられず、おそらくこの答えは同様の問題に直面している人々を助ける

まず、アプリケーションインスタンスを作成する必要があります。

$facebook = new Facebook(array(
  'appId' => '149865361795547',
  'secret' => 'ee827a8df6202e1857b3fc28f3185a61',
  'cookie' => true,
)); 

access_tokenを取得する簡単な方法

$token = $facebook->getAccessToken();

質問するときにページのステータスを取得する

$response = $facebook->api($pageID . '/feed','get',$token);

ありがとう..

2
Danish Iqbal

APIに従うようにしてください。つまり、typeなしで、redirect_uriおよびcode(必要ない場合でも):

$token = file_get_contents('https://graph.facebook.com/oauth/access_token?client_id=<app_id>&client_secret=<app secret>&redirect_uri=<url>&code=<code>');
2
Mars Zhu

古い質問に投稿してすみません。最近のfbアクセスの変更による。私はこのコードを機能させており、助けを必要とする他の誰かのために投稿すると思いました。このメソッドはjQuery ajaxでうまく機能し、facebookからredirect_uriの例を削除します。

$ch = curl_init("https://graph.facebook.com/oauth/access_token?client_id=INSERT_YOUR_APP_ID_HERE&client_secret=INSERT_YOUR_APP_SECRET_HERE&grant_type=client_credentials");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 30000);
$data = curl_exec($ch);
$curl_errno = curl_errno($ch);
$curl_error = curl_error($ch);
curl_close($ch);

if ($curl_errno > 0) 
{
        echo "cURL Error ($curl_errno): $curl_error\n";
} 
else 
{
    echo $data;
}

facebook以外のユーザーに表示するために公開されているaccess_tokenを出力します。つまり、ウェブサイトのグラフAPIを介したFacebookページフィードウォールです。 access_token = 191648007534048 | eVilnMh585rlQLZLvBAmqM6s-1g

phpfacebookoauth2facebook-accesstokenfacebook-oauth

0
Damien Keitel

クエリパラメータがURLエンコードされていることを確認してください。実際は次のようになります。

000000000000%7CAaaAaaAaaAAaAaaaaAaaAa0aaAA

注:typeパラメーターも必要と思われますが、それなしではメッセージとともに500エラーも発生します。

{
   "error": {
   "type": "OAuthException",
   "message": "Error validating verification code."
   }
}

不足している他のパラメーターで表示されるメッセージではなく。 ドキュメント で言及されているものを見ることができません。

0
user242766

接続URLがリダイレクトURIのベースではない場合にも、このエラーが発生する可能性があります。例えば

Connect URL: http://www.example.com/fb/connect/

Redirect URI: http://www.example.com/fb/connect/redirect

リダイレクトURIが接続URLと同じであるという問題に遭遇しましたが、リダイレクトURIの末尾の/を忘れたため、FBはそれらを異なるものとして認識し、認証に失敗しました。

0
Jeremy Raymond