🧰

【Google API】GoogleCredentialを使用せず認可コードからcredentialの情報を取得(Java/Kotlin)

2021/08/04に公開

概要

GoogleのAPIを使用したい時に、OAuth認証を通すことが必要になります。認証フローの概要はこちらにある通り、まずはGoogleでアカウントの認証を行った後に認可コードを取得します。認可コードを受け取った後に、tokenの情報を取得してAPIのリクエストを投げる形になります。
Javaで実装するときは、認可コード→token取得→credential取得→API接続といったフローで実装していく形になります。実装例はGmail API Client Library for Javaでメールを送ってみるを参考にして頂ければと思います。
さて、このソース中のcredentialの取得部分でGoogleCredentialのクラスを使用している実装例が、探すとけっこう出てくるのですが、これはもうDeprecatedの扱いになっているので、できれば使いたくありません。ということで、GoogleCredentialを使わずに、tokenからcredentialを取得する方法を今回紹介していきます。

対応方法

GoogleCredentialとほぼ同様の機能が、com.google.api.client.auth.oauth2.Credentialのクラスに用意されています。このクラスにsetFromTokenResponseが用意されているので、tokenを取得したらこのメソッドを呼び出せばcredentialを取得できそうです。

実装サンプル

前提

サンプルソース

まずは受け取った認可コードから、token情報を取得します。

fun getTokenFromAuthCode(
    googleClientId: String,
    googleSecret: String,
    authCode: String): TokenResponse {
    val req = GoogleAuthorizationCodeTokenRequest(
        NetHttpTransport(),
        JacksonFactory.getDefaultInstance(),
        "https://oauth2.googleapis.com/token",
        googleClientId,
        googleSecret,
        authCode,
        "postmessage" //  リダイレクト不要なので「postmessage」を設定
    )
    req.grantType = "authorization_code"
    val tokenResponse = req.execute()
    return tokenResponse
}

次にcom.google.api.client.auth.oauth2.Credentialを使用したcredentialの取得です。

fun getCredentialFromToken(
    googleClientId: String,
    googleSecret: String,
    backendUrl: String
    token: TokenResponse): Credential {
    val credential = Credential.Builder(BearerToken.authorizationHeaderAccessMethod())
            .setTransport(NetHttpTransport())
            .setJsonFactory(JacksonFactory.getDefaultInstance())
            .setClientAuthentication(ClientParametersAuthentication(googleClientId, googleSecret))
            .setTokenServerUrl(GenericUrl(backendUrl)) // とりあえずバックエンドのURLを設定
            .build()
            .setFromTokenResponse(token)
    return credential
}

最後にcredentialを使用して、ユーザのプロファイル情報を取得してみましょう。実装はHow to get user profile on Google API using the JAVA library?の記事にある内容で取得できます。

fun getProfileFromCredential(credential: Credential) {
        val oauth2 = Oauth2.Builder(NetHttpTransport(), JacksonFactory(), credential)
	   .setApplicationName("Oauth2")
           .build()
        val userinfo = oauth2.userinfo().get().execute()
	// ユーザ名を取得してみる
	println(userinfo.name)
}

Discussion