Google Cloud for Goで OAuth アクセストークンを使う

Posted: , Modified:   GoogleCloudPlatform Go OAuth Qiita

本稿は Qiita 投稿記事 のバックアップです.

概要

GoogleAPIを利用するデスクトップアプリのOAuth2.0認証では,アクセストークンの利用例として Google APIs Client Library for Go を使って利用可能な Zone リストを取得する方法を紹介した.

Go から Google Cloud Platform にアクセスする方法には,Google Cloud for Go を利用する方法もある. Stackdriver Logging からログを取得するStackdriver Logging からログを取得する(その2) で用いている logadminlogging パッケージはこの Google Cloud for Go ライブラリに含まれている.

本記事では,取得した OAuth 2.0 アクセストークンを,Google Cloud for Go のクライアントから利用する方法を紹介する.

Google Cloud for Go のクライアント

Google APIs Client Library for Go では,アクセストークンが付与された http.Client を渡すことで,そのトークンを使用していた. 一方 Google Cloud for Go のクライアントでは,TokenSource を接続オプションとして NewClient に渡すことで使用する.

oauth2.Token 型のアクセストークンから TokenSource を取得するには,前回同様 Config を利用する.Config に認証に必要な情報を渡していることで,アクセストークンの期限が切れていた場合に自動で更新を試みてくれる.

例えば,アクセストークンを使って logging.Client を作成するには次のようなコードになる.

import (
  "context"

  "cloud.google.com/go/logging/apiv2"
  "google.golang.org/api/option"
)

const (
  authorizeEndpoint = "https://accounts.google.com/o/oauth2/v2/auth"
  tokenEndpoint = "https://www.googleapis.com/oauth2/v4/token"
  gcpScope = "https://www.googleapis.com/auth/cloud-platform"
)

func NewLoggingClient(ctx context.Context, token *oauth2.Token) (*logging.Client, error){

  cfg := &oauth2.Config{
    ClientID:     ClientID,
    ClientSecret: ClientSecret,
    Endpoint: oauth2.Endpoint{
      AuthURL:  authorizeEndpoint,
      TokenURL: tokenEndpoint,
    },
    Scopes:      []string{gcpScope},
  }

  return logging.NewClient(
    ctx,
    option.WithTokenSource(cfg.TokenSource(ctx, token)))
}