2017-02-27 15 views
0

ディープリンクを含む電子メールを送信するアプリケーションがあり、OAuth2が使用されています。ディープリンクは、ユーザーがすでにログインしている(有効なアクセストークンを持っている)ときにはうまく動作しますが、トークンが古くなったときには破損していません。その理由は、アプリケーションが特定の深いURL認証サーバーに、自分自身へのリダイレクトURLでリクエストを発行します(元のリクエストのディープリンクではなくメインページです。つまり、アプリケーション用に設定したリダイレクトURLです)。ログインがうまくいくと認証サーバーはリダイレクトを実行し、アプリケーションはメインページを表示し、元のディープリンク要求は忘れてしまいます。このことはすべて、単一のブラウザのウィンドウ/タブ(他のタブを開くことも、ポップアップを使用しないことも要求されます)で発生することが重要です。リダイレクトのためOAuth2とのディープリンクが失われました

認証サーバーがリダイレクトで逐語的に使用する必要がある「状態」要求パラメータを(濫用して)使用する考えがありました。アプリケーションに(アプリケーション内のリンクのような)情報が含まれていました。目的のページを表示します。私は、このような「状態」パラメータがこのように使用されるはずかどうかはわかりませんが、このようなカスタムロジックではなくCSRF防止のために設計されているようです。

もう1つのオプションは、サーバがフルリダイレクトURLと設定されたリダイレクトURLを一致させないことに基づいています。設定されている接頭辞がプレフィックスされているかどうかを確認するだけです(OAuth2仕様では、それは完全一致が行われるべきだと言います)。したがって、リダイレクトURLがディープリンクであり、設定されたURLがプレフィックスであるため、動作します。しかし、サーバーが完全なURLと一致すると判断した場合、この動作は壊れます(そして、Spring Securityで書かれており、この動作を変更するのはかなり簡単です。既にlib:https://github.com/spring-projects/spring-security-oauth/blob/ec215f79f4f73f8bb5d4b8a3ff9abe15b3335866/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/provider/endpoint/ExactMatchRedirectResolver.javaで提供されている別のmatcherクラスを使用します)。 OAuth2と戦わない方法で、より安全なものを使用したいと思います。

これを行うより良い方法はありますか? 「状態」パラメータの

答えて

1

In the specification、説明はテキストで始まります。

要求とコールバックの間の状態を維持するために、クライアントによって使用される不透明な値です。

私にとって、これはあなたが説明する目的を正確に意図していることを意味します。私が取り組んだアプリケーションでは、コールバック応答に必要なすべての状態を含めることができるstateパラメータの値を渡しました。クエリパラメータの値として安全になるようにエンコードする前に、私たちは次のようになりました:nonce=<nonce value>&location=<deep link>。コールバックURIが要求を受け取ると、 'state'パラメータの値を取得し、これを解析し、nonceを確認してその場所にリダイレクトします。

関連する問題