読者です 読者をやめる 読者になる 読者になる

ボクココ

サービス開発を成功させるまでの歩み

Google People API が出たらしいので使ってみた

Rails

ども、@kimihom です。

先日、Google People API がリリースというニュースが流れた。記事を読むと、どうやら従来の Contacts API をよりシンプルにしてくれたAPIだそうだ。てことで好奇心の赴くままに、この People API を触ってみたのでレポートする。

そもそも People API を使えば何ができるかというと、ユーザー毎のコンタクト情報が取得できるようになる。そのため、Google Contacts 連携とかで Google 上に保存されたデータを自分たちのアプリやサービスで取り込みたい場合などに利用できる。一言で言うと、ユーザーの連絡先を手軽に開発者が取ってこれるって話だ。

People API の有効化

まずは Google Developers Console へ行って、People API を有効化する。People で検索して Google People API を Enable にするだけだ。いつの間にかこのページもすごい変わってて驚いた。マテリアルデザイン化されていた。

んで左の認証情報タブをクリックして、 Credential を作成しよう。今回は Web で OAuth してトークンを作る方式にするので、"Create Credentials" -> "OAuth クライアント ID" を選択する。すると以下のような画面になる。

f:id:cevid_cpp:20160304202857p:plain

ここで適当名前を入力し、"承認済みのリダイレクト URI" をOAuth でのログイン後に飛ばすリダイレクトURLを指定する。これもそれぞれの Web アプリケーションに応じて設定しよう。今回は https://www.myowesomeapp.com/auth/gglcallback とする。(ドメインは各自のものに置き換えること)

OAuth 認証

Google の OAuth 認証は、割と SDK を使って認証させる方法が一般的なようだ。しかし、私はよりシンプルな HTTP で取ってくる方法が好きなので、今回はその方法を紹介する。この方法以外なら、 RailsであればOmniAuthだろうか。

まず、OAuth 認証画面の表示から。Ruby on Rails で書いた。例えばページ内の"連携"とかってボタンを押すとこのページgglauthにリ飛ぶようにセットする。そしたらさらにgglauthアクションがGoogle のログインページにリダイレクトする。

  def gglauth
    scope = "https://www.googleapis.com/auth/contacts.readonly https://www.googleapis.com/auth/user.addresses.read https://www.googleapis.com/auth/user.emails.read  https://www.googleapis.com/auth/user.phonenumbers.read"
    redirect_url = "https://www.myowesomeapp.com/auth/gglcallback"
    redirect_to "https://accounts.google.com/o/oauth2/v2/auth?client_id=#{ENV['GGL_API_KEY']}&scope=#{scope}&response_type=code&redirect_uri=#{redirect_url}&access_type=offline"
  end

scopeってのは People API でどのデータを取ってくるか。今回は電話番号とかメールアドレス、住所も取ってきたかったので割と全部指定した。どんな種類のスコープがあるかはここで閲覧できる。

client_id は Create Credentials で作った時にできた client_id だ。 access_type=offlineを入れてるのは、後でリフレッシュトークンを取得するために付け加えている。

OAuth コールバック処理

続いて、Google のログインページで許可した後に戻ってくるAuthorize Token 周りの処理。

うまくコールバックが帰ってくると、指定したリダイレクトURLにtoken ってのを付与したパラメータと共に渡ってくる。これを Faraday を使ってシンプルなHTTP POST を送信し、 access_token を取得しよう。

  def gglcallback
    conn = Faraday.new(:url => 'https://www.googleapis.com') do |builder|
      builder.request  :url_encoded
      builder.adapter  :net_http
    end
    res = conn.post '/oauth2/v4/token', {
      code: params[:code],
      client_id: ENV['GGL_API_KEY'],
      client_secret: ENV['GGL_API_SECRET'],
      redirect_uri: "https://www.myowesomeapp.com/auth/gglcallback",
      grant_type: "authorization_code"
    }
    res.body #=> ここに access_token, refresh_token などが入ってくる!
    # res.body を保存
    # 連携成功    
  end

このaccess_token, refresh_token をどこに保存するのかは開発者に委ねられている。適切な場所に保管し、APIアクセスの時に取り出せるようにしておこう。

API アクセス

access_token さえ取れればあとはこっちのもの。好きなように People API を呼び出そう。パラメータに access_token: "取得したアクセストークン"を付け加えるだけでOKだ。

People API では、自分の保存したコンタクト一覧を取ってこれる connection, そのコネクションごとのコンタクト情報を取ってくる batchGet とかが使えるだろう。この batchGet の resourceNamesの指定できる数が最大50件までらしいので、 connection も50件取ってきて、nextPageToken があれば再度 connection を呼び出してまた getBatchGet を呼ぶという流れになると思う。

トークンは指定秒数で切れちゃうので、 refresh_token を用いて access_token を更新していく必要がある。その方法はこちらのドキュメントに書いてある。

所感

Google 様とまでなると全て SDK でできますよ〜って感じで手軽にできるといえばできるのだが、HTTP リクエストでアクセストークンとか取ってきた方が個人的にはよっぽどわかりやすい。今回の方法はどんな言語でも同じように実装できるので、参考になると思う。

前のGoogle Contact 情報を取ってくるAPIがどんなに複雑だったのかそんなに知らないけど、少なくとも今回の People API はシンプルな OAuth でコンタクト情報を取ってくることができた。