您可以讓用戶在輸入功能受限的設備(例如連接互聯網的電視)上使用其Google帳戶登錄您的應用。
該應用程序向用戶顯示一個簡短的代碼和登錄URL。然後,用戶在Web瀏覽器中打開登錄URL,輸入代碼,並授予應用訪問用戶登錄信息的權限。最終,該應用收到確認,並且用戶已登錄。
要使用此登錄流程,該應用必須在滿足以下條件的設備上運行:
- 該設備必須能夠顯示40個字符的URL和15個字符的用戶代碼,以及對用戶的指示。
- 該設備必須連接到Internet。
獲取客戶ID和客戶機密
您的應用需要OAuth 2.0客戶端ID和客戶端密碼,才能向Google的登錄端點發出請求。
要找到您項目的客戶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
值,並同時以指定的interval
輪詢登錄端點,直到用戶登錄或通過expires_in
指定的interval
為止。
顯示用戶代碼和驗證URL
從設備端點收到用戶代碼和驗證URL後,顯示它們並指示用戶打開URL並輸入用戶代碼。
verification_url
和user_code
的值可能會發生變化。以可以處理以下限制的方式設計用戶界面:
-
user_code
必須顯示在足夠寬的字段中,以處理15W
大小的字符。 -
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"];