GmailのAPIについては以前記事にしたが、 別のAPI使うときにどうするのか、毎回悩むので汎用的な部分はここにまとめることにした。

今回使いたくなったのはGoogle Photos APIsなのでこれを例に進めるが、 汎用的に使えるように書く。

APIの有効化

Gmailのときと同じく、Google API Consoleで使いたいAPIを有効化する。 ライブラリからAPIの検索ができる。今回は’Photo’で検索すると、Photos Library API1が出てくるので、 選択して、’有効にする’をクリック。

このページにドキュメントへのリンクがあるので、開いておく(あとで使う)。

続いて、Google API Consoleのトップに戻ってから、認証情報に進む。

認証情報を作成 -> OAuthクライアントID -> その他

で認証情報を作成して、JSONファイルをダウンロードする。

Scopeの取得

APIのドキュメントにScopeが書かれているので、それを探す。 Photos Library APIの場合は、Overviewの中のAuthorizationにScope記載ページへのリンクがあった。 ここから、必要な権限を取れるScopeを選ぶ。

ちなみにGmailとかDriveだとgoogle-api-clientというgemにScopeのパスを定義した定数があるので、それを使うことが多い。 ここに使いたいAPIがあればそれを使うと良い。

Access Tokenの取得

googleauthというgemを使う。

$ gem install googleauth

からの

require "googleauth"
require "googleauth/stores/file_token_store"
require "fileutils"
require "json"

class Auth
  OOB_URI = "urn:ietf:wg:oauth:2.0:oob".freeze
  CREDENTIALS_PATH = "credentials.json".freeze
  # The file token.yaml stores the user's access and refresh tokens, and is
  # created automatically when the authorization flow completes for the first
  # time.
  TOKEN_PATH = "token.yaml".freeze
  SCOPE = ['https://www.googleapis.com/auth/photoslibrary.readonly']

  def initialize
    authorize
  end

  private

  ##
  # Ensure valid credentials, either by restoring from the saved credentials
  # files or intitiating an OAuth2 authorization. If authorization is required,
  # the user's default browser will be launched to approve the request.
  #
  # @return [Google::Auth::UserRefreshCredentials] OAuth2 credentials
  def authorize
    client_id = Google::Auth::ClientId.from_file CREDENTIALS_PATH
    token_store = Google::Auth::Stores::FileTokenStore.new file: TOKEN_PATH
    authorizer = Google::Auth::UserAuthorizer.new client_id, SCOPE, token_store
    user_id = "default"
    credentials = authorizer.get_credentials user_id
    if credentials.nil?
      url = authorizer.get_authorization_url base_url: OOB_URI
      puts "Open the following URL in the browser and enter the " \
           "resulting code after authorization:\n" + url
      code = gets
      credentials = authorizer.get_and_store_credentials_from_code(
        user_id: user_id, code: code, base_url: OOB_URI
      )
    end
    credentials
  end
end

Auth.new

ここで、CREDENTIALS_PATHはダウロードしたJSONファイル。これはrbファイルと同じ場所に置いている前提。 また、SCOPEには取得したScopeを書く。

このスクリプトを実行すると、初回はAccess Tokenを取得するためのページへのURLが表示される。 ブラウザでここを開くと、アクセス権限を渡してよいか聞かれるのでOKを押すと、コードが表示されるので、それをターミナルに貼り付けてエンターキーを押すと、 Access Tokenが取得できる。


  1. ここでの名前はPhotos Library APIだけど、ドキュメントにはGoogle Photos APIsと出る [return]