10

オンラインでの Cakephp Auth コンポーネントと Facebook ログインの統合に関する最新のリソースはほとんどないようです。次のリソースを見つけました。

  1. Cakephp 1.3 を使用した古いベーカリーの記事? および古いバージョンの Facebook SDK
  2. 開発中と思われるwebtechnick による Cakephp プラグイン

これ以外に決定的なリソースは見つかりませんでした。統合を可能な限り柔軟に (魔法のプラグインを使用せずに) したかったのです。そのため、多くの調査の結果、今日ここで共有する適切なソリューションを最終的に作成しました。私はケーキにかなり慣れていないので、貢献してください。

4

1 に答える 1

31

シームレスなユーザー認証のための Cakephp 2.x Auth と Facebook Auth の統合

まず、素晴らしい CakePHP Auth Componentを読み、cakephp book 2.xのSimple Authentication and Authorization Application チュートリアルに従ってください (シリーズの最初の 2 つのチュートリアルにも従ったと仮定します。完了したら、ユーザー認証と認可を備えたシンプルな CakePHP アプリケーションを構築することができました。

次に、facebook SDKをダウンロードし、facebook からアプリ IDを取得する必要があります。


まず、Facebook SDK を App/Vendors にコピーします。次に、AppController のbeforeFilterメソッドでインポートして初期化します。

//app/Controller/AppController.php

public function beforeFilter() {
    App::import('Vendor', 'facebook-php-sdk-master/src/facebook');
    $this->Facebook = new Facebook(array(
        'appId'     =>  'App_ID_of_facebook',
        'secret'    =>  'App_Secret'

    ));

    $this->Auth->allow('index', 'view');
}

アプリケーション全体でアクセスできるように、AppController で Facebook SDK を初期化しています。次に、SDK を使用して Facebook ログイン URL を生成し、それをビューに渡します。通常、これはbeforeRenderメソッドで行います。

注: 上記の構成の詳細 (appId とシークレット) は、できれば App/Config/facebook.php に保存する必要があります。次にCake Configureを使用する必要があります。

//app/Controller/AppController.php

public function beforeRender() {
    $this->set('fb_login_url', $this->Facebook->getLoginUrl(array('redirect_uri' => Router::url(array('controller' => 'users', 'action' => 'login'), true))));
    $this->set('user', $this->Auth->user());
}

ログインしていないすべてのユーザーに対して Facebook ログインへのこのリンクを表示できるように、レイアウトを更新します。redirect_uriアプリケーションの User/login アクションにどのように設定したかに注意してください。これは、Facebook がユーザーを認証したら、cake::Auth を使用してログインできるようにするためです。この質問の解決策を含め、これにはさまざまな利点があります。

<!-- App/Views/Layouts/default.ctp just after <div id="content"> -->
<?php
    if($user) echo 'Welcome ' . $user['username'];
    else {
        echo $this->Html->link('Facebook Login', $fb_login_url) . ' | ';
        echo $this->Html->link('Logout', array('controller' => 'user', 'action' => 'logout'));
?>

ユーザーがログイン リンクをクリックすると、facebook SDK はユーザーをログインさせ、ユーザーをアプリのユーザー/ログインにリダイレクトします。これを処理するために、このアクションを更新します。

// App/Controller/UsersController.php
// Handles login attempts from both facebook SDK and local
public function login()
{
    // If it is a post request we can assume this is a local login request
    if ($this->request->isPost()){
        if ($this->Auth->login()){
            $this->redirect($this->Auth->redirectUrl());
        } else {
            $this->Session->setFlash(__('Invalid Username or password. Try again.'));
        }
    } 

    // When facebook login is used, facebook always returns $_GET['code'].
    elseif($this->request->query('code')){

        // User login successful
        $fb_user = $this->Facebook->getUser();          # Returns facebook user_id
        if ($fb_user){
            $fb_user = $this->Facebook->api('/me');     # Returns user information

            // We will varify if a local user exists first
            $local_user = $this->User->find('first', array(
                'conditions' => array('username' => $fb_user['email'])
            ));

            // If exists, we will log them in
            if ($local_user){
                $this->Auth->login($local_user['User']);            # Manual Login
                $this->redirect($this->Auth->redirectUrl());
            } 

            // Otherwise we ll add a new user (Registration)
            else {
                $data['User'] = array(
                    'username'      => $fb_user['email'],                               # Normally Unique
                    'password'      => AuthComponent::password(uniqid(md5(mt_rand()))), # Set random password
                    'role'          => 'author'
                );

                // You should change this part to include data validation
                $this->User->save($data, array('validate' => false));

                // After registration we will redirect them back here so they will be logged in
                $this->redirect(Router::url('/users/login?code=true', true));
            }
        }

        else{
            // User login failed..
        }
    }
}

これで完了です。ご覧のとおり、ほとんどの重労働はこのアクションによって行われます。上記のコードの一部を UserModel に移動することをお勧めします。ということで、ここまでの流れをまとめました。

最初に、ログイン リクエストがアプリケーションのログイン フォーム @ Users/login から送信されているかどうかを確認します。存在する場合は、単にユーザーをログインします。それ以外の場合は、ユーザーがデータベースに存在するかどうか、およびユーザーがログインしているか新しいユーザーを作成しているかを確認してから、ログインします。

ここでは、facebook_id などの電子メール以外の情報でユーザーを確認するように注意してください。そうしないと、ユーザーが Facebook の電子メールを変更して、アプリケーションの別のユーザーをハイジャックする可能性があります。

ハッピーコーディング!

于 2013-08-03T22:36:26.117 に答える