@int128

int128.hatenablog.com

Spring Security OAuthにおけるアクセストークン取得失敗時の例外

Spring Security OAuthでアクセストークンの取得に失敗した場合のリトライを設計するため、エラーケースと例外の対応を調べてみました。

アクセストークンの取得をリトライするには以下の2つの方法があります。

  1. アクセストークン取得(AccessTokenProvider#obtainAccessToken)をリトライする。
  2. 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 未調査

上記を踏まえると、リトライの対象例外は ConnectExceptionHttpServerErrorException にするとよさそうです。リトライの実装方法は下記で書いているのでご参考まで。

int128.hatenablog.com