Google致力於提高黑人社區的種族平等。 怎麼看。

電視和設備的Google登錄

您可以讓用戶在輸入功能受限的設備(例如連接互聯網的電視)上使用其Google帳戶登錄您的應用。

該應用程序向用戶顯示一個簡短的代碼和登錄URL。然後,用戶在Web瀏覽器中打開登錄URL,輸入代碼,並授予應用訪問用戶登錄信息的權限。最終,該應用收到確認,並且用戶已登錄。

要使用此登錄流程,該應用必須在滿足以下條件的設備上運行:

  • 該設備必須能夠顯示40個字符的URL和15個字符的用戶代碼,以及對用戶的指示。
  • 該設備必須連接到Internet。

獲取客戶ID和客戶機密

您的應用需要OAuth 2.0客戶端ID和客戶端密碼,才能向Google的登錄端點發出請求。

要找到您項目的客戶ID和客戶機密,請執行以下操作:

  1. 選擇現有的OAuth 2.0憑據或打開“憑據”頁面
  2. 如果尚未執行此操作,請通過單擊創建憑據> OAuth客戶端ID並提供創建憑據所需的信息來創建項目的OAuth 2.0憑據。
  3. OAuth 2.0客戶端ID部分中查找客戶端ID 。有關詳細信息,請單擊客戶端ID。

如果要創建新的客戶端ID,請選擇“電視和受限輸入設備”應用程序類型。

獲取用戶代碼和驗證URL

用戶請求使用Google帳戶登錄後,您可以通過向OAuth 2.0設備端點https://oauth2.googleapis.com/device/code發送HTTP POST請求來獲取用戶代碼和驗證URL。在請求中包括您的客戶ID和所需範圍的列表。如果您只想使用其Google帳戶登錄用戶,則僅請求profileemail範圍;或者,如果您想請求允許代表用戶調用受支持的API的權限,除了profileemail範圍之外,還請求所需的範圍。

以下是請求用戶代碼的示例:

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_codeverification_url值,並同時以指定的interval輪詢登錄端點,直到用戶登錄或通過expires_in指定的interval為止。

顯示用戶代碼和驗證URL

從設備端點收到用戶代碼和驗證URL後,顯示它們並指示用戶打開URL並輸入用戶代碼。

verification_urluser_code的值可能會發生變化。以可以處理以下限制的方式設計用戶界面:

  • 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=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令牌獲取用戶個人資料信息

您可以通過使用任何JWT解碼庫對ID令牌進行解碼來獲取有關已登錄用戶的個人資料信息。例如,使用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"];

更多信息