はじめに
こんにちは、新卒2年目の岡崎です。今回は、GoogleのOAuth2.0で受け取ったトークンを取り消す方法を紹介します。
環境
openjdk version "21.0.2" 2024-01-16 LTS OpenJDK Runtime Environment Corretto-21.0.2.13.1 (build 21.0.2+13-LTS) OpenJDK 64-Bit Server VM Corretto-21.0.2.13.1 (build 21.0.2+13-LTS, mixed mode, sharing)
- Spring Boot
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.2.1)
- build.gradle
build.grafleに以下の設定を加えます。
dependencies { implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' }
実装例
GoogleのOAuth2.0で受け取ったトークンを取り消すには、ユーザーがアカウント設定にアクセスして取り消す方法やアプリケーション側で取り消す方法があります。今回は、アプリケーション側で取り消す方法を考えます。
curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \ https://oauth2.googleapis.com/revoke?token={token}
詳細を知りたい方は、公式ドキュメントをご覧ください。
アクセストークンの取得
ますは、アクセストークンを取得する必要があります。
@RequiredArgsConstructor public class Oauth2Service { private final OAuth2AuthorizedClientService authorizedClientService; private final ModelMapper modelMapper; public String getToken(Authentication authentication) { final OAuth2AuthenticationToken token = modelMapper.map(authentication, OAuth2AuthenticationToken.class); final OAuth2AuthorizedClient currentAuthorizedClient = authorizedClientService.loadAuthorizedClient( auth2AuthenticationToken.getAuthorizedClientRegistrationId(), auth2AuthenticationToken.getName() ); return currentAuthorizedClient.getAccessToken().getTokenValue(); } }
これでアクセストークンを取得することができます。
アクセストークンの取り消し
取得したアクセストークンを使い、取り消しを行います。
以下は、GoogleのOAuth2.0で受け取ったアクセストークンを取り消す実装例です。
@RequiredArgsConstructor public class OAtuh2TokenComponent { private final QueryParams queryParams; private final RestTemplate restTemplate; private final static String GOOGLE_LOGIN_REVOKE_URI = "https://accounts.google.com/o/oauth2/revoke"; @Override public void revokeOatuh2Token(String token) { final HttpHeaders httpHeaders = HttpHeadersBuilder.build(); final HttpEntity<String> entity = new HttpEntity<>(httpHeaders); final MultiValueMap<String, String> queryParams = this.queryParams .builder() .add("token", token) .build(); final URI uri = UriComponentsBuilder .fromUriString(GOOGLE_LOGIN_REVOKE_URI) .queryParams(queryParams) .build() .encode() .toUri(); try { restTemplate.exchange(uri, HttpMethod.POST, entity, Void.class); } catch (Exception exception) { throw new InternalServerErrorException("API request exception: " + exception.getMessage(), exception); } } }
QueryParamsの実装例です。
@Component @RequiredArgsConstructor public class QueryParams { private final SpringProfile springProfile; /** * クエリパラメータを取得する * * @return クエリパラメータ */ public QueryParamsBuilder builder() { return new QueryParamsBuilder("domainパス"); } public static class QueryParamsBuilder { private final LinkedMultiValueMap<String, String> queryParams; /** * コンストラクタ * * @param selfDomain 自ドメイン */ public QueryParamsBuilder(String selfDomain) { this.queryParams = new LinkedMultiValueMap<>(); this.queryParams.add("domain", selfDomain); } /** * クエリパラメータを追加する * * @param key キー * @param value 値 * @return クエリパラメータビルダー */ public QueryParamsBuilder add(String key, String value) { this.queryParams.add(key, value); return this; } /** * クエリパラメータを取得する * * @return クエリパラメータ */ public MultiValueMap<String, String> build() { return this.queryParams.deepCopy(); } } }
上記で実装したメソッドを呼び出し、アクセストークンが取り消されたことが確認できれば実装完了です。
最後に
今回は、JavaでGoogleのOAuth2.0で受け取ったトークンを取り消す方法について紹介しました。誰かの参考になれば幸いです。
エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを募集しております。
興味があれば是非ご連絡いただければと思います!
募集職種一覧はこちら www.wantedly.com