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 にするとよさそうです。リトライの実装方法は下記で書いているのでご参考まで。