【Google API】GoogleCredentialを使用せず認可コードからcredentialの情報を取得(Java/Kotlin)
概要
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を取得できそうです。
実装サンプル
前提
- サンプルはKotlinで実装します。(Javaでもほとんど変わらないと思いますが)
- 認可コードはフロントエンドから送られてくるものとし、サンプルソースからは取得部分は割愛します。フロントエンド側の実装は、Vueの例だとVue.js から Google OAuthでaccess_token,refresh_tokenを取得するの記事が参考になると思います。
- クライアントIDとシークレットを事前に取得済みの前提とします。クライアントIDとシークレットの取得方法はGoogle 外部認証用のクライアントIDとクライアントシークレットを取得するの記事を参照ください。
サンプルソース
まずは受け取った認可コードから、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