インターネットに接続されたテレビなど、入力機能が制限されたデバイスで、ユーザーが Google アカウントを使用してアプリにログインできるようにできます。
アプリによって、ユーザーにショートコードとログイン URL が表示されます。ユーザーは、ウェブブラウザでログイン URL を開き、コードを入力して、ユーザーのログイン情報にアクセスする権限をアプリに付与します。最後に、アプリが確認を受け取り、ユーザーがログインします。
このログイン フローを使用するには、アプリが次の条件を満たすデバイスで実行されている必要があります。
- デバイスは、40 文字の URL と 15 文字のユーザーコード、およびユーザーへの指示を表示できることが必要です。
- デバイスがインターネットに接続されている必要があります。
クライアント ID とクライアント シークレットを作成する
アプリが Google のログイン エンドポイントにリクエストを送信するには、OAuth 2.0 クライアント ID とクライアント シークレットが必要です。
プロジェクトのクライアント ID とクライアント シークレットを検索するには、次の手順を実行します。
- 既存の OAuth 2.0 認証情報を選択するか、[認証情報] ページを開きます。
- まだ作成していない場合は、[認証情報を作成] > [OAuth クライアント ID] をクリックして、認証情報の作成に必要な情報を入力し、プロジェクトの OAuth 2.0 認証情報を作成します。
- [OAuth 2.0 クライアント ID] セクションで [クライアント ID] を確認します。詳細を確認するには、クライアント ID をクリックします。
新しいクライアント ID を作成する場合は、[テレビと入力機能が制限されたデバイス] のアプリケーション タイプを選択します。
ユーザーコードと確認用 URL を取得する
ユーザーが Google アカウントを使用したログインをリクエストすると、HTTP POST リクエストを OAuth 2.0 デバイス エンドポイント https://oauth2.googleapis.com/device/code
に送信してユーザーコードと確認用 URL を取得します。リクエストには、クライアント ID と必要なスコープのリストを含めてください。ユーザーの Google アカウントでのみログインする場合は、profile
スコープと email
スコープのみをリクエストします。ユーザーに代わってサポートされている API を呼び出す権限をリクエストする場合は、profile
スコープと email
スコープに加えて、必要なスコープをリクエストします。
ユーザーコードのリクエストの例を次に示します。
POST /device/code HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded
client_id=YOUR_GOOGLE_CLIENT_ID&scope=email%20profile
使用中: curl
curl -d "client_id=YOUR_GOOGLE_CLIENT_ID&scope=email profile" https://oauth2.googleapis.com/device/code
レスポンスは JSON オブジェクトとして返されます。
{
"device_code" : "4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8",
"user_code" : "GQVQ-JKEC",
"verification_url" : "https://www.google.com/device",
"expires_in" : 1800,
"interval" : 5
}
アプリは、user_code
値と verification_url
値をユーザーに表示し、同時に、ユーザーがログインするか、expires_in
で指定された時間が経過するまで、指定された interval
でログイン エンドポイントをポーリングします。
ユーザーコードと確認 URL を表示する
デバイス エンドポイントからユーザーコードと確認 URL を受け取ったら、それらを表示し、URL を開いてユーザーコードを入力するようユーザーに指示します。
verification_url
と user_code
の値は変更される場合があります。次の上限に対応できる UI を設計します。
user_code
は、15 個のW
サイズの文字を処理できるだけの幅のフィールドに表示する必要があります。verification_url
は、40 文字の URL 文字列を処理できる十分な幅のフィールドに表示する必要があります。
どちらの文字列にも、US-ASCII 文字セットの印刷可能な文字を含めることができます。
user_code
文字列を表示する際は、文字列を変更しないでください(大文字と小文字の変更や、他の書式文字の挿入など)。将来的にコードの形式が変更されると、アプリが破損する可能性があります。
表示目的で URL からスキームを削除することで、verification_url
文字列を変更できます。使用する場合は、アプリが「http」と「https」の両方のバリエーションを処理できることを確認してください。それ以外の場合は、verification_url
文字列を変更しないでください。
ユーザーが確認 URL にアクセスすると、次のようなページが表示されます。
ユーザーがユーザーコードを入力すると、Google ログイン サイトに次のような同意画面が表示されます。
ユーザーが [許可] をクリックすると、アプリはユーザーを識別するための ID トークン、Google API を呼び出すためのアクセス トークン、新しいトークンを取得するための更新トークンを取得できます。
ID トークンと更新トークンを取得する
アプリにユーザーコードと確認 URL が表示されたら、デバイス エンドポイントから受け取ったデバイスコードを使用して、トークン エンドポイント(https://oauth2.googleapis.com/token
)のポーリングを開始します。interval
値で指定された間隔(秒単位)でトークン エンドポイントをポーリングします。
リクエストの例を次に示します。
POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded
client_id=YOUR_GOOGLE_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&code=DEVICE_CODE&grant_type=http://oauth.net/grant_type/device/1.0
使用中: curl
curl -d "client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&code=YOUR_DEVICE_CODE&grant_type=http://oauth.net/grant_type/device/1.0" https://oauth2.googleapis.com/token
ユーザーがリクエストをまだ承認していない場合、レスポンスは次のようになります。
{
"error" : "authorization_pending"
}
アプリは、interval
の値を超えないレートでこれらのリクエストを繰り返す必要があります。アプリでのポーリングが早すぎると、次のようなレスポンスが返されます。
{
"error" : "slow_down"
}
ユーザーがログインして、リクエストしたスコープへのアクセスをアプリに許可すると、アプリの次のリクエストに対するレスポンスには、ID トークン、アクセス トークン、更新トークンが含まれます。
{
"access_token": "ya29.AHES6ZSuY8f6WFLswSv0HZLP2J4cCvFSj-8GiZM0Pr6cgXU",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "1/551G1yXUqgkDGnkfFk6ZbjMMMDIMxo3JFc8lY8CAR-Q",
"id_token": "eyJhbGciOiJSUzI..."
}
このレスポンスを受け取ったアプリは、ID トークンをデコードしてログイン ユーザーに関する基本的なプロフィール情報を取得します。また、ID トークンをアプリのバックエンド サーバーに送信して、サーバーで安全に認証することもできます。また、アプリはアクセス トークンを使用して、ユーザーが承認した Google API を呼び出すこともできます。
ID トークンとアクセス トークンの存続期間は限られています。トークンの有効期間が過ぎてもユーザーのログインを維持するには、更新トークンを保存し、それを使用して新しいトークンをリクエストします。
ID トークンからユーザー プロフィール情報を取得する
ログイン中のユーザーのプロフィール情報を取得するには、JWT デコード ライブラリを使用して ID トークンをデコードします。たとえば、Auth0 の jwt-decode JavaScript ライブラリを使用します。
var user_profile = jwt_decode(<var>id_token</var>);
// The "sub" field is available on all ID tokens. This value is unique for each
// Google account and can be used to identify the user. (But do not send this
// value to your server; instead, send the whole ID token so its authenticity
// can be verified.)
var user_id = user_profile["sub"];
// These values are available when you request the "profile" and "email" scopes.
var user_email = user_profile["email"];
var email_verified = user_profile["email_verified"];
var user_name = user_profile["name"];
var user_photo_url = user_profile["picture"];
var user_given_name = user_profile["given_name"];
var user_family_name = user_profile["family_name"];
var user_locale = user_profile["locale"];
詳細
- ID トークンの有効期間を超えてユーザーをログイン状態にするには、アクセス トークンを更新するをご覧ください。
- バックエンド サーバーで認証する必要がある場合は、安全に行う方法についてバックエンド サーバーで認証するをご覧ください。