Spring Security OAuthにおけるアクセストークン取得失敗時の例外
Spring Security OAuthでアクセストークンの取得に失敗した場合のリトライを設計するため、エラーケースと例外の対応を調べてみました。
アクセストークンの取得をリトライするには以下の2つの方法があります。
- アクセストークン取得(
AccessTokenProvider#obtainAccessToken
)をリトライする。 ClientHttpRequestInterceptor
でHTTPリクエストをリトライする。
前者の場合、失敗の原因にかかわらず OAuth2AccessDeniedException
が発生するので、 OAuth2AccessDeniedException
に対してリトライを行えばOKです。後者の場合は下記を参考にしてください。(7/28追記)
以下のテストケースに記載があります。
テストケースからは下記の仕様が読み取れます。
エラーケース | 例外 |
---|---|
ステータスコード400で "{"error":"access_denied"} が返された場合 |
UserDeniedAuthorizationException |
ステータスコード403で "{"error":"access_denied"} が返された場合 |
OAuth2AccessDeniedException |
400番台のステータスコードが返された場合 | HttpClientErrorException |
500番台のステータスコードが返された場合 | HttpServerErrorException |
これだけでは足りないので実際に検証した結果が下記です。
エラーケース | 例外 |
---|---|
接続に失敗した場合 | ConnectException |
Content-Typeとリクエストボディが合致しない場合 | OAuth2AccessDeniedException |
上記を踏まえると、リトライの対象例外は ConnectException
と HttpServerErrorException
にするとよさそうです。リトライの実装方法は下記で書いているのでご参考まで。