[Java]GoogleのOAuth2.0で受け取ったトークンを取り消す方法[Spring Boot]

はじめに

こんにちは、新卒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}

詳細を知りたい方は、公式ドキュメントをご覧ください。

developers.google.com

このリクエストをJavaで実装します。

アクセストークンの取得

ますは、アクセストークンを取得する必要があります。

@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();
        }
    }
}

上記で実装したメソッドを呼び出し、アクセストークンが取り消されたことが確認できれば実装完了です。

最後に

今回は、JavaGoogleのOAuth2.0で受け取ったトークンを取り消す方法について紹介しました。誰かの参考になれば幸いです。

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを募集しております。
興味があれば是非ご連絡いただければと思います!

募集職種一覧はこちら www.wantedly.com