2011-11-17 8 views
5

/login上に存在するプレーンサインフォーム(ユーザー名/パスワード)と、/ login-via-facebook FOSFacebookBundle oauth手順でログインしてください。symfony2のFOSFacebookBundleを使用してFacebook経由でサインインするためのURLを作成する方法

私はoauth-facebook手続きをurlで起動する方法を理解できません。これは、 "access_control"にリストされているURLにアクセスしようとする場合にのみ機能します。

ありがとうございます!


@Matt、あなたの説明に非常に感謝します! 私はあなたの答えを追跡しようとしましたが、まだ問題を抱えている、私はすでにFOSUserBundle、

私のsecurity.ymlを使用していることを言及しなかった。

そう
providers: 
    chain_provider: 
     providers: [fos_userbundle, fos_facebook] 
    fos_userbundle: 
     id: fos_user.user_manager 
    fos_facebook: 
     id: fos_facebook.auth 

firewalls:  
    public: 
     pattern: ^/ 
     fos_facebook: 
     app_url: "" 
     server_url: "" 
     login_path: /login 
     check_path: /login_check/facebook 
     provider: fos_userbundle 
     fos_userbundle: 
     login_path: /login 
     check_path: /login_check/form 
     provider: fos_userbundle 
     anonymous: true 
     logout: true` 

、この時点で、それは例外をスローします:InvalidConfigurationException: Unrecognized options "fos_userbundle" under "security.firewalls.public" fos_userbundleをpublicファイアウォールでform_loginに変更すると、例外がスローされます。You must configure the check path to be handled by the firewall using form_login in your security firewall configuration.

+0

見したい場合FOSUserBundleとFOSFacebookBundleの両方を実装簡単な例のバンドルがあります。 – Matt

答えて

4

このトリックは、フォームログインと1つのファイアウォールで2つの分離したエントリを持つことですFacebookのログイン用。しかし私のケースでは、ユーザーが自分の資格情報を使用してログインするか、Facebook接続をクリックしてFOSFacebookBundleを使用してFacebook OAuth2 API経由で認証することができる単一のログインURLがあります。ここでは、この作品を作るために私のsecurity.yml設定ファイルのサンプル:

security: 
    factories: 
    - "%kernel.root_dir%/../vendor/bundles/FOS/FacebookBundle/Resources/config/security_factories.xml" 

    providers: 
    chain_provider: 
     providers: [acme.form_provider, acme.facebook_provider] 
    acme.form_provider: 
     id: acme.user_provider.form 
    acme.facebook_provider: 
     id: acme.user_provider.facebook 

    firewalls: 
    dev: 
     pattern: ^/(_(profiler|wdt)|css|images|js)/ 
     security: false 

    public: 
     pattern: ^/ 
     fos_facebook: 
     app_url: "your_app_url" 
     server_url: "your_server_url" 
     login_path: /login 
     check_path: /login_check/facebook 
     provider: acme.facebook_provider 
     form_login: 
     login_path: /login 
     check_path: /login_check/form 
     provider: acme.form_provider 
     anonymous: true 
     logout: true 

    role_hierarchy: 
    ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

そして、ここでは、この作業を行うために必要なセキュリティルートを定義するために使用される私のrouting.ymlファイルのサンプル:使用

# This is defined to let the user log in. The controller for 
    # route display the login form and a facebook connect button 
_security_login: 
    pattern: /login 
    defaults: { _controller: AcmeAcmeBundle:Main:login } 

# This is defined for the form login authentication, 
# no controller is associated with it 
_security_check_form: 
    pattern: /login_check/form 

# This is defined for facebook login authentication, 
# a controller is associated with it but does nothing 
_security_check_facebook: 
    pattern: /login_check/facebook 
      defaults: { _controller: AcmeAcmeBundle:Main:loginCheckFacebook } 

_security_logout: 
    pattern: /logout 
    defaults: { _controller: AcmeAcmeBundle:Main:logout } 

security.ymlの前に、セキュリティー・メカニズムは、ユーザーがfacebookでログインする前にフォームを使用してログインしたユーザーをチェックします。これは、プロバイダーがchain_providerで定義されている順番であるためです。各リクエストで、FOSFacebookBundleは、facebookのoauth2 Cookieが存在するかどうかを確認し、存在する場合は、そのユーザーを読み込もうとします。 Cookieが見つからない場合、認証プロセスは、別のプロバイダがFacebookプロバイダの後に定義されている場合は、別のプロバイダを試します。

ユーザーが保護されたURL(access_control)にアクセスしようとすると、Facebookのログインページが表示され、認証され、サイトにリダイレクトされ、Cookieが検出され、ユーザーが認証されますFOSFacebookBundleによって正常に完了しました。手動で認証プロセスを開始するには、サイトにfacebook接続ボタンを配置してから、javascriptでユーザーをサイトの別のページにリダイレクトします。このようにして、クッキーは接続ボタンによって設定され、FOSFacebookBundleは次のリクエストで彼を認証します。私がやっているのは、facebook connectボタンが成功したときにjavascriptのfacebookのlogin_checkパスにユーザをリダイレクトすることです。このようにして、セキュリティ機構は、セキュリティ設定で示されている場所にリダイレクトします。

私はこれがあなたが望むものを達成するのに役立つことを願っています。何か不明な点がある場合は、さらに質問をしてください。

実際にフォローアップ#1

@それは有効なオプションではありませんので、ファイアウォールの構成のノードpublicfos_userbundleを置くことはできません。文字列fos_userbundleは、FOSUserBundle UserProviderクラスを参照するために使用されます。私はこのバンドルを使用したことはありませんでしたが、ドキュメントを読む場合は、form_loginを使用してください。 FOSUserBundleのドキュメントをStep #5以下で見ることができます。あなたが言及したエラーは、login_pathがファイアウォールで処理されていないが、ファイアウォールが/^/)で始まるものと一致しているので、奇妙なことです。何がうまくいかないのか分かりませんが、あなたは正しい方向に進んでいます。 form_loginを使用し、そこから機能しない理由を調べてみてください。それはサービスのために不足しているオプションを充電するので、それが重要だ

factories: 
    - "%kernel.root_dir%/../vendor/bundles/FOS/FacebookBundle/Resources/config/security_factories.xml" 

よろしく、
マット

+0

ありがとう、私は質問を編集しました、あなたはいくつかの時間がある場合は見てください。 – synthetic

7

あなたはあなたのためのsecurity.ymlを確認しました。

+0

これは実際に私のバグの1つを解決しました。このスレッドのエントリをありがとう – Hezad

1

あなたは私が私の答えにフォローアップを追加しました https://github.com/ollietb/OhFOSFacebookUserBundle

+0

これを出版していただきありがとうございます!あなたのコードを使って、完全なSymfony 2.1アプリを作成しました:https://github.com/meonkeys/symfony21-dual-auth –

+0

git repoが動いた。新しいURL:https://github.com/meonkeys/symfony2-dual-auth –

関連する問題