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におまかせできると、セキュリティの心配がかなり軽減できます。
まだドキュメントベースでしか調べていないので、これから実装して動作を確認してみたいと思います。