Google Sign-In についての情報

スマホアプリとWebアプリの認証をGoogleに任せることができないか、と思い立ち、Google Sign-In について調べてみました。

 

Google Sign-In とは?

Google Sign-In とは、Googleが提供している認証系ツールの総称である Google Identity Platform のツールの1つで、スマホアプリやWebアプリの認証をGoogleアカウントでできるようにするものです。

 

Google Sign-In でできること

Compare Auth Options のページに書かれているままですが、

  • ユーザーがGoogleアカウントでアプリにアクセスできる。
  • 1度サインインすれば、他のデバイスでも認証済みになる。
  • Webサイト側で直接、Androidアプリのインストールが可能になる。
  • Googleの各種サービスをアプリに統合できる。

 

クライアントの実装方法

 

バックエンドサーバーの認証

クライアントでGoogleの認証が通った後、バックエンドサーバーの認証を通す方法です。

基本的な仕組みとしては、クライアントからユーザーのIDトークン(ユーザーIDそのものではない)をサーバーに送り、サーバー側でIDトークンを検証し、ユーザーIDを取得する、という流れになります。

サーバー側でこれを実装するには、基本的には、Google API Client Library を使用します。

また、tokeninfo というエンドポイントが用意されているので、そこで検証してもらうことも可能です。

なお、Google API Client Library の正式版が提供されている言語は、この記事の執筆時点では、Java, Python, .NET, JavaScript だけで、他の言語はまだベータかアルファの状態です。

 

バックエンドサーバーの認証フローのイメージ

バックエンドサーバーの認証は、いわゆる「トークン認証」というものになります。

トークン認証では、トークンの形式として JSON Web Token (JWT) が使われます。

トークン認証のフローとしては、以下の例がわかりやすいと思います。

# dockerコンテナを起動して
# 任意のパスワードでユーザー作成
$ curl -X POST http://127.0.0.1:3000/user -d 'name=testuser' -d 'password=secretpassword'
{"id":2,"name":"testuser","password":"secretpassword","updated_at":"2016-08-03T14:02:08.000Z","created_at":"2016-08-03T14:02:08.000Z"}
# ユーザー認証をパスワードで行う
$ curl -X POST http://127.0.0.1:3000/authentication -d 'name=testuser' -d 'password=secretpassword'
{"token":"CREATED-JSON-WEB-TOKEN","message":"Authentication successfully finished."}%
# 別のホストでログインする
$ curl -X POST http://127.0.0.1:8000/login -d 'access_token=CREATED-JSON-WEB-TOKEN"'
{"id":2,"name":"testuser"}

引用元: JWT(JSON Web Token)を使った認証を試みる | 69log

Google Sign-In の場合だと、最初の2つがGoogleでの認証になり、3つ目でバックエンドサーバーの認証を行うわけです。

トークンは、HTTPヘッダーにセットして渡すこともできます:

Authorization: bearer {token} 

 

Androidアプリで連絡先の権限を取得しなくて済む?

どこかのドキュメントで読んだ気がしたのですが、見つかりませんでした。

後で検証してみようと思います。

サンプルエミュレーターで動かしてみたところ、連絡先の権限は要求されませんでした。

 

サーバー側のIDトークン認証はローカルで可能

これらのライブラリを使えば、ネットワーク呼び出しがなくても、トークンをローカルで認証できます。

引用元: Google Developers Japan: Google Sign-In を使ってサーバー側で認証を行う

 

ローカル処理で完結するなら、サーバーのAPI呼び出しごとにIDトークンを認証しても、処理コストは低そう。

 

あとがき

Google Sign-In でアカウント管理と認証をすべてGoogleにおまかせできると、セキュリティの心配がかなり軽減できます。

まだドキュメントベースでしか調べていないので、これから実装して動作を確認してみたいと思います。