インターネット接続テレビなどの入力機能が制限されたデバイスで、ユーザーが 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 アカウントを使用してログインするようリクエストすると、OAuth 2.0 デバイス エンドポイント(https://oauth2.googleapis.com/device/code
)に HTTP POST リクエストを送信して、ユーザーコードと確認用 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=CLIENT_ID&scope=email%20profile
使用中: curl
curl -d "client_id=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
は、W
サイズの 15 文字を処理するのに十分な幅で表示する必要があります。verification_url
は、40 文字の長さの URL 文字列を処理するのに十分な幅で表示する必要があります。
どちらの文字列にも、US-ASCII 文字セットの任意の出力文字を含めることができます。
user_code
文字列を表示する場合、いかなる方法(文字列の変更や他の書式設定文字の挿入など)でも、文字列を変更しないでください。将来的にコードの形式が変更されると、アプリが破損する可能性があります。
verification_url
文字列を変更するには、表示の目的で URL からスキームを削除します。その場合、アプリが「https」と「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=CLIENT_ID&client_secret=CLIENT_SECRET&code=DEVICE_CODE&grant_type=http://oauth.net/grant_type/device/1.0
使用中: curl
curl -d "client_id=CLIENT_ID&client_secret=CLIENT_SECRET&code=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 トークンからユーザー プロフィール情報を取得する
ID トークンを任意の JWT デコード ライブラリでデコードすることで、ログインしているユーザーのプロファイル情報を取得できます。たとえば、Auth0 の jwt-decode JavaScript ライブラリを使用すると、次のようになります。
var user_profile = jwt_decode(id_token); // 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 トークンの有効期間を超えてログインした状態を保持するには、アクセス トークンの更新をご覧ください。
- バックエンド サーバーで認証する必要がある場合は、バックエンド サーバーで認証するを参照して、安全に認証する方法を確認してください。