1

誰かがSpring OAuth2 (このリンクの API のソース コードPOST) でtoを実行すると、サーバーで CSRF トークンが更新されます。 /oauth/authorize


1.) 新たに作成された CSRF トークンにコードでアクセスしますか?
2.) 新しく作成された CSRF トークンのコピーを不活性セッション変数に割り当てますか?
3.) その後、別のクラスで使用するために新しいセッション変数を取得しますか?

この要件のコンテキストは、ユーザーが/oauth/authorizeエンドポイントを介して多数のパスを作成している間に、複数のフィルターとコントローラーを介した可変ルーティングを含む制御フローです。変数は、セッション スコープに保存してから、セッション スコープから取得し、アルゴリズムの必要に応じてリクエスト スコープに戻す必要があります。

上記のセッション変数を作成および使用する必要がある可能性のあるクラスのタイプの例には、次のものがあります。

1.) を持つ任意のクラス@Controller annotation
2.) OncePerRequestFilterの任意のカスタム実装、
3.) の任意のカスタム実装DefaultOAuth2RequestFactory
4.) カスタム フィルタ チェーンで使用されるその他のタイプのクラス。

これは、Spring MVC と Spring Security からソース コードが構築された Spring OAuth2 API に関係していても、Spring MVC の質問または Spring Security の質問、またはその両方である可能性があります。

4

2 に答える 2

2

Spring Security のドキュメントでは、これについて詳しく説明しています。セクション タイトルInclude the CSRF Tokenを使用してトークンにアクセスできます。このセクションの要約:

  • これにアプローチする 1 つの方法は、_csrf 要求属性を使用して現在の CsrfToken を取得することです。JSP でこれを行う例を以下に示します。
<c:url var="logoutUrl" value="/logout"/>
<form action="${logoutUrl}"
    method="post">
<input type="submit"
    value="Log out" />
<input type="hidden"
    name="${_csrf.parameterName}"
    value="${_csrf.token}"/>
</form>
  • Spring MVC<form:form>タグまたは Thymeleaf 2.1+ を使用していて、 を使用している@EnableWebSecurity場合、CsrfTokenが自動的に含まれます ( を使用CsrfRequestDataValueProcessor)。詳細については、トークンの自動組み込みを参照してください。
  • Spring Security は、現在の Spring MVC 引数をCsrfTokenResolver自動的に解決できるものを提供します。CsrfTokenを使用@EnableWebSecurityすると、Spring MVC 構成に自動的に追加されます。XML ベースの構成を使用する場合は、これを自分で追加する必要があります。

を適切に構成したら、静的な HTML ベースCsrfTokenResolverのアプリケーションに を公開できます。CsrfToken

@RestController
public class CsrfController {

    @RequestMapping("/csrf")
    public CsrfToken csrf(CsrfToken token) {
        return token;
    }
}

CsrfToken他のドメインから秘密を守ることが重要です。つまり、Cross Origin Sharing (CORS) を使用している場合、CsrfToken を外部ドメインに公開しないでください。

于 2016-05-18T14:03:52.210 に答える
0

これはOPが求めていたものです:

1.) 次のように CSRF トークンを取得します。

ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
CsrfToken csrf = (CsrfToken) attr.getRequest().getAttribute(CsrfToken.class.getName());

2.) 次に、トークンを使って好きなことをします。(混乱を招かないように、何をしているのかをよく理解してください。) おそらくcsrf、あるクラスのコードでトークンを不活性なセッション変数に入れ、別のクラスのコードで引き出す必要があるまでそのままにしておきます。 .

3.) 次に (おそらく、制御フローの他の場所にある別のクラスのコードで)、次のようにトークンをリクエストに戻します。

attr.setAttribute("_csrf", csrf, RequestAttributes.SCOPE_REQUEST);
RequestContextHolder.setRequestAttributes(attr);

上記は、カスタム処理の副作用をクリーンアップするために使用されます。たとえば、古いリクエストが保存されてからDefaultOAuth2RequestFactoryまたはのカスタム実装で再利用される状況ですOncePerRequestFiltercsrf、古いリクエストの作成時と新しいリクエストの間でトークン値が変更されたため、csrf値を更新する必要があります。制御フローに追加する前に、古いリクエストで。

于 2016-05-19T18:59:10.130 に答える