5

ドキュメントによると: "redirect_uri-(オプション)ログイン/承認プロセスが完了するとユーザーをリダイレクトするURL。ユーザーはログインの成功と失敗の両方でURLにリダイレクトされるため、URLのエラーパラメータを確認する必要があります。認証ドキュメントに記載されているとおりです。このプロパティが指定されていない場合、ユーザーは現在のURL(つまり、このメソッドが呼び出されたページのURL、通常はユーザーのブラウザの現在のURL)にリダイレクトされます。」したがって、ユーザーが認証/許可を拒否したかどうかをキャッチする方法がありますが、対応するドキュメントへのリンクはもう存在しません(https://developers.facebook.com/docs/authentication/)。

簡単にするために、redirect_uriは開始phpファイルと同じアドレスであり、phpコードは次のように単純です。

require 'facebook.php';
$facebook = new Facebook(array(
  'appId'  => 'X',
  'secret' => 'Y',
));
$user = $facebook->getUser();
if ($user) {
  try {
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    error_log($e);
    $user = null;
  }
}
if (!$user) {
  $params = array(
    'scope' => 'read_stream, friends_likes',
    'redirect_uri' => 'http://myapp.com/app'
  );
  $loginUrl = $facebook->getLoginUrl($params);
}

誰かがその情報をキャッチする方法を知っていますか?

4

3 に答える 3

11

次の操作を実行して、権限を確認できます。

$permissions = $facebook->api("/me/permissions");
if( array_key_exists('publish_stream', $permissions['data'][0]) ) {
    // Permission is granted!
    // Do the related task
    $post_id = $facebook->api('/me/feed', 'post', array('message'=>'Hello World!'));
} else {
    // We don't have the permission
    // Alert the user or ask for the permission!
    header( "Location: " . $facebook->getLoginUrl(array("scope" => "publish_stream")) );
}
于 2013-02-08T11:23:45.397 に答える
0

最新のPHPfacebookSDKには、メソッド->apiがないことに注意してください。このチェックを(時々)使用して権限を取得する際にも問題があるようです。古いSDKを使用すると、FBアクセストークンデバッガーのチェックで適切なアクセス許可が表示されたにもかかわらず、一部のユーザーが「OAuthException:(#412)ユーザーがアプリケーションをインストールしていません」と表示されることがありました。新しいSDKに更新し、アクセス許可の簡単なデータリストを取得する新しい方法を見つけた後、すべてが再び機能しました。

この解決策を見つけるのにFBWebサイトを掘り下げるのに多くの時間がかかったので、ここに貼り付けて、他の誰かを数時間節約できることを願っています。彼らの実際の節約は、getDecodedBodyメソッドの発見でした(FBドキュメントでトリックを見つけるのは非常に困難です)。私の例では、publish_actionsをチェックするだけです。

$fb = new Facebook\Facebook([
    'app_id' => your_app_id,
    'app_secret' => your_secret,
    'default_graph_version' => 'v2.2',
 ]);

$badperms=true; //start by assume bad permissions

try {
    $response = $fb->get('/me/permissions', $at);
    $perms = $response->getDecodedBody();

    if($badperms){
        foreach($perms['data'] AS $perm){
            if($perm['permission']=='publish_actions' && $perm['status']=='granted') $badperms=false;
        }
    }

} catch(Facebook\Exceptions\FacebookResponseException $e) {
    log("MSG-received facebook Response exception!! ".$e->getMessage());
} catch(Facebook\Exceptions\FacebookSDKException $e) {
    log("MSG-received facebook SDK exception!! ".$e->getMessage());
}

if($badperms) {
    //do something like reflow auth
}
于 2015-10-06T23:55:07.497 に答える
0

同じ問題が発生しました。キャンセルアクションの処理方法がわかりませんでした(facebook phpapiとgoogleoauth2の両方で)。

解決策は予想よりもはるかに簡単です。

許可が(まったく)受け入れられなかった場合の応答には、少なくとも1つのパラメーター/変数(URLのエラー)が含まれます。

Facebookでは、その応答は次のようになります。

error = access_denied&error_code = 200&error_description = Permissions + error&error_reason = user_denied

グーグルの場合、あなたは

error = access_denied

しかし、それで十分なはずです。

エラーが設定されているかどうかを確認しているだけで、設定されている場合は、応答をログインページにリダイレクトしています。

このステップは実際には文書化されていないので、誰かに役立つことを願っています。ちなみに、Facebook APIのバージョン:google APIのv5バージョンoAuth2:2.0(最新バージョンを見つけることになると、google docは本当に混乱していると思います)

于 2015-12-22T13:13:42.113 に答える