ユーザーがアプリまたは Facebook を使用してサインアップし、アプリまたは Facebook を使用してログインすることもできる Facebook PHP SDK の可能な実装をテストするために、非常に単純な CakePHP アプリケーションを作成しました。しかし、ユーザーはアプリ上で何かを行うことができるため、Facebook アカウントを介してログイン/登録した場合でも、アプリ上にユーザー アカウントを持っていることになります。
これまでのところ、認証を処理してユーザー情報を取得するための 2 つのメソッドを作成しました。
// Asks user to authenticate
public function facebook()
{
$params = array(
'redirect_uri' => 'http://domain.com/users/signupfacebook',
'scope'=> 'email',
'display' => 'popup'
);
$loginUrl = $this->Facebook->Sdk->getLoginUrl($params);
// Need to know if user is already a user on OUR app
// If true log them in. If false redirect to signup form like below
$this->autoRender = false;
$this->response->header('Location', $loginUrl);
}
// Handle the return
public function signupfacebook()
{
$user = $this->Facebook->Sdk->getUser();
if($user)
{
try
{
$facebookuser = $this->Facebook->Sdk->api('/me');
$this->set('facebookuser', $facebookuser);
}
catch(FacebookApiException $e)
{
error_log($e);
$user = NULL;
}
}
else
{
$this->Session->setFlash('An error has occurred! Please try again.');
$this->redirect(array('action'=>'index'));
}
}
したがって、ユーザーは Facebook を使用して認証したいと言い、これはコントローラーの facebook() メソッドを使用して、許可を求め、このアクションに基づいてリダイレクトします。現在、渡されたユーザー情報に基づいて、次のようにいくつかのフィールドが事前に入力されているサインアップページに送信されます。
<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->input('User.email', array('type' => 'text', 'default'=> $facebookuser['email'], 'label' => array('class' => 'placeholder', 'text' => 'Email address') )); ?>
<?php echo $this->Form->input('User.firstname', array('type' => 'text', 'default'=> $facebookuser['first_name'], 'label' => array('class' => 'placeholder', 'text' => 'Firstname') )); ?>
<?php echo $this->Form->input('User.lastname', array('type' => 'text', 'default'=> $facebookuser['last_name'], 'label' => array('class' => 'placeholder', 'text' => 'Lastname') )); ?>
<?php echo $this->Form->input('User.username', array('type' => 'text', 'default'=> $facebookuser['username'], 'label' => array('class' => 'placeholder', 'text' => 'Username') )); ?>
<?php echo $this->Form->input('User.password', array('value' => '','type' => 'password', 'label' => array('class' => 'placeholder', 'text' => 'Password') )); ?>
<button type="submit">Create</button>
<?php echo $this->Form->end(); ?>
しかし、ここにはいくつかの問題があります。
質問 1.)ユーザーが、入力したばかりの Facebook 資格情報を使用してシステムにアカウントを既に持っている場合、これを処理してユーザーをログインさせる必要があります。これには、Facebook 側から何か特別なものを使用する必要がありますか? ユーザーテーブルで一致するアカウントを検索して自動的にログインすることを考えていますが、FB認証が行われた後に自分のユーザーテーブルを認証する例をオンラインで見つけられませんでした.
質問 2.)前の質問に関連している可能性がありますが、ユーザーがアカウントを登録すると、ログインに使用した Facebook アカウントとの関連付けは保存されないため、Facebook を使用して再度ログインしようとすると、関連付けは表示されません。同様の詳細についてDBを検索しますが、これも非常に不安定で、APIの正しい使用法ではないようです。基本的に、ユーザーは FB を使用してフォームに入力しただけで、Facebook アカウントを使用して実際に物理的にサインアップしたわけではありません。
Facebook経由で渡されたものと同じメールアドレスがDBに存在するかどうかを確認できましたが、その後変更された場合はどうなりますか? 接続が保存されるように、FacebookのユーザーIDをアプリのユーザーIDとともにテーブルに保存することを考えました。これは解決策になりますか?またはこれを行う間違った方法ですか?
例えば、FB ユーザーと CakePHP アプリユーザーの間のリンクを保存する新しいテーブル:
id
user_id (this is the relationship to your USER table)
facebook_user_id
しかし、これを行う場合でも、フォームを自動入力したり、特定の詳細が一致した場合にユーザーをログインさせたりするのではなく、アカウントを便利な方法で適切にリンクし、Facebook を介した認証を正しく処理するためにこれをどのように利用するのかわかりません (これには潜在的なセキュリティリスクがあると確信しています)。
質問 3.)ユーザーが Facebook 経由でサインアップ フォームに戻ると、次の URL が表示されます (セキュリティ上の理由からビットが変更されていることに注意してください)。
http://domain.com/users/signupfacebook?state=dbf2f6dds322b7cb90d71b6c958a001bf4a3ba&code=AQa7-GDsesM0ZfgswjgGF-mMKwjcoboLl19WKprIA2-f4iZzUdsd8o8z-NweYYODzySS3h9GksBw0G9WCXj79Pp-0ldyeIRCOLSt9gfgfsmEFEfOrEO6gm7a0jmDuQvchdsaHaw1QpI8RdGTCrqAPlLzpHGcqiCtBvXjiQtBhQP--tMr8CIlvRwbrJRwiZwF6xo30howlRkVTLddsdDCDt60_KGznPVmEe-T4Qbu9gdkv9v#_=_
以下に基づいて私が言えることから: https://developers.facebook.com/docs/howtos/login/server-side-login/コードを処理し、アクセストークンを返します。
しかし、OAuth プロセスの第 2 段階を実行してアクセス トークンを取得することなく、サインアップ フォームに入力するために必要なすべての情報にアクセスできました。この状況で必要かどうかわかりません... それとも必要ですか? もしそうなら、最初の2つの質問を解決するのにどのように役立ちますか?