1

PHPをベースにウェブサイトにFB socialログインを実装していました。私はFBのウェブサイトをチェックし、実装が容易であることを発見しました。以下は、私が従ったアプローチです。ここにセキュリティの問題があると確信していませんFBソーシャルログインPHP - なぜ人々はそれを難し​​くするのですか?

私はFacebookのJS SDKのアプローチを使用していました。

と、次のようにされています。サーバー側で

var appID = 'xxxxxxxxxxxxxxx'; 
window.fbAsyncInit = function() { 
FB.init({ 
    appId  : appID, // App ID 
    channelUrl : '', 
    status  : true, 
    cookie  : true, 
    xfbml  : true, 
}); 
FB.getLoginStatus(function(response) { 
if (response.status === 'connected') { 
    // connected 
    FB.api('/me?fields=id,name,email,permissions', function(response) { 
     //alert('Good to see you, ' + response.name + '.'); 
    }); 
}else{ 

} 
}); 
}; 

function login() { 
    if(navigator.userAgent.match('CriOS')){ 
    } 
    else{ 
    FB.login(function(response) { 
     if (response.authResponse) { 
      replace_login(); 
     } else { 
      // cancelled 
      alert('User cancelled login or did not fully authorize.'); 
     } 
    },{scope: 'email,public_profile,user_friends'}); 
} 
} 

function replace_login(){ 
    FB.api('/me?fields=id,name,email', function(response) { 
     $.ajax({ 
      url: "s-account", 
      type: 'POST', 
      data: response, 
      dataType: 'json', 
      beforeSend: function(){ 
       $("#signin_fb").button('loading'); 
      }, 
      success: function(data) { 
      $("#signin_fb").button('reset'); 
      window.location.reload(); 
      }, 
      error: function(){ 
       $("#signin_fb").button('reset'); 
      } 
     }); 
    }); 
} 

そしてPHPには、私は、AJAX呼び出しを介してデータベース内social_id, name and emailのようにユーザーの詳細を格納していますし、DB操作が成功したならば、私は私でSession Variableを設定していますusername and emailのウェブサイトで、ユーザーが正常にログインしています。

は、ログアウトのために、私は、ウェブサイトのユーザーセッションを破壊するために私自身のログアウト機能を使用していますが、ユーザーが正常にログアウトされます。

さて、セキュリティ上のリスクはありますか?ユーザーがログアウトして再度ログインしようとすると、JS SDKは新しい応答で新しいアクセストークンを取得するためです。

答えて

2

この認証プロセス全体は、s-accountへのajaxコールになっています。 という名前ののメールからのFB.api()をPOSTリクエストでバックエンドアプリケーションに送信していますが、言及していないので、私はこれらの詳細についてアクセストークンを確認していないと推測します。これらの詳細に基づいてセッションを作成するだけです。

セキュリティ上の問題が今

、セキュリティ上の問題は、サーバー側でクライアント側の認証を使用していることです。ユーザはs-accountにFacebookのような偽のレスポンスを返すだけで、のユーザ名のメールのアドレスを生成することができ、あなたのPHPアプリケーションは正当なソースからの詳細な確認をせずにユーザを認証し、 。悪意のあるユーザーが任意のメールs-accountに簡単なPOSTリクエストを生成することにより、任意のアカウントでログインすることができますので、あなたの認証は完全にこの段階で壊れています。

Facebookを利用して修正する方法

は、アクセストークンを検証し、このアクセストークンに関連付けられているユーザーの詳細を返しグラフAPIのエンドポイントを提供します。 Docs

このエンドポイントは、特定のアクセストークンに関するメタデータを返します。この は、そのようなトークンが トークンは、それが期限切れになったとき、まだ有効であり、どのような権限 アプリは、特定のユーザーのために持っているかどうか、発行されたユーザーなどのデータを含んでいます。

Fbを。Login()は、アクセストークンをresponse.authResponse.accessToken、userIdをresponse.authResponse.userIDと生成します。このaccessToken & userIDを、他のユーザーの詳細と共に、s-accountへのajaxコールで送信し、次のAPIエンドポイントを使用して、詳細が正当かどうかを検証します。

curl -X GET "https://graph.facebook.com/v2.6/debug_token?input_token=USER_ACCESS_TOKEN_FROM_AJAX_CALL&access_token=YOUR_APP_ACCESS_TOKEN" 

アクセストークンが有効な場合、このトークンが発行されたuserIDで次の応答が返されます。

{ 
    "data": { 
    "app_id": "YOUR_APP_ID", 
    "application": "YOUR_APP_NAME", 
    "expires_at": 1462777200, 
    "is_valid": true, 
    "scopes": [ 
     "email", 
     "manage_pages", 
     "pages_messaging", 
     "pages_messaging_phone_number", 
     "public_profile" 
    ], 
    "user_id": "THE_USER_ID_ASSOCIATED_WITH_THE_TOKEN" 
    } 
} 

今あなたがAJAX呼び出しで受け取ったユーザーIDと、このuserIDを比較すると詳細が合法かどうかを確認することができます。

はdebug_tokenのAPIを使用して、ユーザーのアクセストークンをデバッグするには、あなたのAPP_ACCESS_TOKEN

を取得する方法は、次のAPIエンドポイントを使用して、サーバー側のアプリのアクセストークンを生成する必要があります。

curl -X GET "https://graph.facebook.com/v2.6/oauth/access_token?client_id=YOUR_APP_ID&client_secret=YOUR_APP_SECRET&grant_type=client_credentials" 

これにより、あなたのアプリのアクセストークンが返されます。

{ 
    "access_token": "YOUR_APP_ACCESS_TOKEN_HERE", 
    "token_type": "bearer" 
} 
+0

ブリリアント..私は昨日、偽のデータで、このPOSTコールの問題を考え出したし、ちょっとそれを修正..しかし、あなたの説明は、より安全なソリューションを提供しています。この 'curl -X GET'と' YOUR_APP_ACCESS_TOKEN'はどこに配置しますか?それはAPP IDですか? – Gags

+0

いいえ、アプリのアクセストークンはappIdではありません。最後のセクション「APP_ACCESS_TOKENを取得する方法」をお読みください。 "curl -X GET"は、APIに対するHTTPリクエストを表します。 PHPのCURL(http://php.net/manual/en/curl.examples.php)を使用して、サーバー側でこのHTTPリクエストを行うことができます。 –

+0

POSTの後に、 'あなたのAPP_ACCESS_TOKENを取得する方法は'実行する必要がありますか? FB PHP SDKを使用して – Gags

関連する問題