FOSOauthServerBundle、FOSUserBundle、および Symfony2.0 を使用して、OAuth2の実装時に独自の auth_login フォームを作成する方法について、このドキュメント( http://blog.logicexception.com/2012/04/securing-syfmony2-rest-service-wiith.html ) に従いました。 FOSOAuthServerBundle を使用します。ちなみに、私の謙虚な観点からは良い投稿です。
私はそれをほとんどやり遂げたと言わなければなりません。しかし、動作しない奇妙な動作があります。誰かが私の問題を見て、可能な解決策についての手がかりを教えてくれませんか??
以前の考慮事項
このページの手順を作成する前に、FOSOAuthServerBundle を適切に構成しました。プロセスを完了し、トークンを適切に取得し、ユーザー資格情報を認証し、セッションも作成します。唯一のことは、私の Web サイトのメインのログイン フォームとは異なる特定のログイン フォームがないことです。したがって、認証コードを取得しようとしたときに表示されるページは、通常のログイン ページです。私が欲しいのは、マニュアルに記載されているように、モバイルデバイスで使いやすいように、より小さく、より具体的な別のログインフォームを表示することです。
問題
このページで説明されていることを正確に開発すると、次の動作が得られます。
- 適切なパラメーターを指定して「^/oauth/v2/auth」を呼び出します
- 予想どおり、/auth_login ページにリダイレクトされます
- ユーザーの資格情報を入力します (正しいログインとパスワード)
ログイン プロセスの後、Symfony は適切なパラメーターを使用して "^/oauth/v2/auth" に再度リダイレクトしようとしますが、驚いたことに、インターセプターまたは何かがその要求をキャッチし、再び /auth_login にリダイレクトされます。
- 面白いのは、セッションが作成されることです (つまり、その瞬間に URL バーにサイトの既存のページを入力すると、すべてのセッションと作成されたものが要求されたページに正常にリダイレクトされます)。** したがって、問題はパターン "^/oauth/v2/auth" にあります。セッションを作成したかどうかに関係なく、セッションは常に傍受されて /auth_login にリダイレクトされます (そのため、最終的にトークンを取得する方法でワークフローが正しく進行しません。
唯一の違い
私が持っているものとマニュアルに記載されているものの間にあるのは、小枝ページを使用して auth_login フォームを表示していることだけです。これが問題になるとは思いませんが、とにかく、次に投稿します。
<form action="{{ path("acme_oauth_server_auth_login_check") }}" method="post">
<input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />
<label for="username">{{ 'security.login.username'|trans({}, 'FOSUserBundle') }}</label>
<input type="text" id="username" name="_username" value="{{ last_username }}" />
<label for="password">{{ 'security.login.password'|trans({}, 'FOSUserBundle') }}</label>
<input type="password" id="password" name="_password" />
<input type="checkbox" id="remember_me" name="_remember_me" value="on" />
<label for="remember_me">{{ 'security.login.remember_me'|trans({}, 'FOSUserBundle') }}</label>
<input type="submit" id="_submit" name="_submit" value="{{ 'security.login.submit'|trans({}, 'FOSUserBundle') }}" />
</form>
もう一つ
どちらも機能しませんが、フォームのアクション フィールドに次を配置するというトリック (または回避策) を検討しています。
{{ path("fos_user_security_check") }}
これは、/auth_login フォームを作成して、FOSOAuthServerBundle の代わりに FOSUserBundle が使用する同じ login_check にデータを送信することを意味します。
この場合の効果は次のとおりです。
- 適切なパラメーターを指定して「^/oauth/v2/auth」を呼び出します
- 予想どおり、/auth_login ページにリダイレクトされます
- ユーザーの資格情報を入力します (正しいログインとパスワード)
- ログインプロセスの後、^/oauth/v2/auth のリダイレクトがうまく実行され、authorization_code が取得されます
- ^/oauth/v2/token URL のおかげで access_token を取得してすべてを完了します
- サプライズ!!すべてが適切に行われていますが、この場合、セッションは作成されません。これは、後で API を呼び出すにはあまりにも悪いことです (セッションが作成されないため、API は何も取得しません)。たとえば、資格情報を入力したユーザーに属する特定のアイテムの全リストを API から取得したい状況を想像してみてください。明らかに、セッションが作成されていないため、メイン ページへのリダイレクトだけが表示されます (symfony2 でファイアウォールを設定した方法です)。
だから… すべてがとても奇妙です。
誰かが私を助けてくれれば、本当に感謝しています。
どうもありがとう
ペドロ