鍍金池/ 教程/ Java/ Web 服務(wù)器應(yīng)用程序中使用 OAuth 2.0
本地安裝的應(yīng)用程序中使用 OAuth 2.0
設(shè)備中使用 OAuth 2.0
使用 OAuth 2.0 來(lái)訪問(wèn)谷歌 API
Web 服務(wù)器應(yīng)用程序中使用 OAuth 2.0
服務(wù)類(lèi)應(yīng)用中使用 OAuth 2.0
跨客戶端身份憑證
客戶端應(yīng)用程序中使用 OAuth 2.0
谷歌應(yīng)用程序默認(rèn)憑證

Web 服務(wù)器應(yīng)用程序中使用 OAuth 2.0

谷歌 OAuth 2.0 端點(diǎn)支持使用下列語(yǔ)言和框架編寫(xiě)的 Web 服務(wù)器應(yīng)用程序:PHP,Java,Python,Ruby,和 ASP.NET。 這些應(yīng)用程序可能會(huì)在用戶使用的時(shí)候或用戶沒(méi)在使用的時(shí)候訪問(wèn)谷歌 API。這種工作流需要應(yīng)用程序有能力保存一個(gè) secret。

這個(gè)文檔描述了如何從 Web 服務(wù)器應(yīng)用程序使用 OAuth 2.0 訪問(wèn)谷歌 API。

概覽

授權(quán)程序會(huì)在你的應(yīng)用程序?qū)⒁粋€(gè)瀏覽器重定向到一個(gè)谷歌 URL;一個(gè)包含查詢參數(shù)的 URL 顯示出正在請(qǐng)求的訪問(wèn)類(lèi)型。和其他情形一樣,谷歌會(huì)處理用戶認(rèn)證,會(huì)話選擇,用戶準(zhǔn)許(User consent)。這一程序的結(jié)果是授權(quán)碼,谷歌會(huì)將授權(quán)碼以查詢串的形式返回給您的應(yīng)用程序。

接收到授權(quán)碼之后,你的應(yīng)用程序可以通過(guò)密碼交換(同時(shí)也會(huì)進(jìn)行客戶端 ID 和客戶端 secret 交換)來(lái)獲得訪問(wèn)令牌,在某種情形下還會(huì)得到一個(gè)刷新令牌。

應(yīng)用程序可以使用訪問(wèn)令牌來(lái)訪問(wèn)谷歌 API。

如果一個(gè)刷新令牌在授權(quán)碼交換時(shí)存在,那么它可以在任何時(shí)候用來(lái)獲取新的訪問(wèn)令牌。這叫做離線訪問(wèn),因?yàn)閼?yīng)用程序用這種方法取得新的訪問(wèn)令牌時(shí)不需要用戶值守瀏覽器。

http://wiki.jikexueyuan.com/project/google-oauth-2/images/webflow.png" alt="" />

生成 URL

用于認(rèn)證用戶的 URL 是 https://accounts.google.com/o/oauth2/auth。這個(gè)端點(diǎn)只能通過(guò) SSL 訪問(wèn),HTTP 連接會(huì)被拒絕。

端點(diǎn):https://accounts.google.com/o/oauth2/auth
描述:這個(gè)端點(diǎn)是初次請(qǐng)求的目標(biāo)。它負(fù)責(zé)處理尋找活動(dòng)會(huì)話,認(rèn)證用戶和用戶準(zhǔn)許。當(dāng)您的應(yīng)用程序?qū)υ摱它c(diǎn)發(fā)送請(qǐng)求時(shí),回應(yīng)會(huì)包含一個(gè)訪問(wèn)令牌,一個(gè)刷新令牌,和一個(gè)授權(quán)碼。

--

對(duì)于 web 服務(wù)器應(yīng)用程序,谷歌認(rèn)證服務(wù)器支持的查詢串參數(shù)集為:

參數(shù): response_type (響應(yīng)類(lèi)型)
值: code (密碼)
描述: 決定 Google OAuth 2.0 端點(diǎn)是否要返回授權(quán)碼。 對(duì)于 Web 服務(wù)器應(yīng)用程序,參數(shù)應(yīng)該使用 code。

--

參數(shù): client_id (客戶端 ID)
值: 你從開(kāi)發(fā)者控制臺(tái)處獲得的客戶端 ID。
描述: 確定是哪個(gè)客戶端正在發(fā)出請(qǐng)求。傳過(guò)去的這個(gè)參數(shù)值必須要與開(kāi)發(fā)者控制臺(tái)里顯示的完全一致。

--

參數(shù): redirect_uri (重定向 URI)
值:開(kāi)發(fā)者控制臺(tái)里列出的這個(gè)工程的 redirect_urivalues 其中一個(gè)值。
描述: 決定回應(yīng)(Response)會(huì)發(fā)向哪里。這個(gè)參數(shù)的值必須和谷歌開(kāi)發(fā)者控制臺(tái)為這個(gè)工程所顯示的值的其中一個(gè)完全一致(包括完整的 HTTP 或 HTTPS 格式、大小寫(xiě)、和末尾的'/'符號(hào))。

--

參數(shù): scope (域)
值: 用空格分隔該應(yīng)用程序所請(qǐng)求的權(quán)限集。
描述: 確認(rèn)您的應(yīng)用程序請(qǐng)求的谷歌 API 訪問(wèn)權(quán)。傳過(guò)去的參數(shù)值會(huì)以用戶準(zhǔn)許頁(yè)面的方式向用戶顯示。請(qǐng)求的權(quán)限數(shù)量和獲得用戶準(zhǔn)許的可能性有逆相關(guān)關(guān)系。若想了解可用的登陸域,請(qǐng)參見(jiàn)登陸域。若想了解所有谷歌 API 的可用域,請(qǐng)?jiān)L問(wèn) API 瀏覽器?;旧蠞u進(jìn)地請(qǐng)求域是一項(xiàng)最佳實(shí)踐,比起提前一次性請(qǐng)求所有權(quán)限,按需請(qǐng)求更好。舉例來(lái)說(shuō),一個(gè)想要支持購(gòu)買(mǎi)功能的應(yīng)用程序應(yīng)該在用戶點(diǎn)擊“購(gòu)買(mǎi)”按鈕的時(shí)候才要求谷歌錢(qián)包訪問(wèn)權(quán); 詳情參閱漸進(jìn)式授權(quán)

--

參數(shù): state (狀態(tài))
值: 任意字符串
描述: 當(dāng)收到回應(yīng)時(shí)提供任何可能對(duì)您的應(yīng)用程序有用的狀態(tài)。谷歌認(rèn)證服務(wù)器會(huì)回傳這個(gè)參數(shù),所以您的應(yīng)用程序會(huì)收到和它發(fā)出去一樣的內(nèi)容。若想防止跨站請(qǐng)求偽造攻擊(CSRF), 我們強(qiáng)烈推薦您在狀態(tài)中包含防偽造令牌,并且在回應(yīng)中進(jìn)行確認(rèn)。詳情請(qǐng)參見(jiàn)OpenID 連接?來(lái)獲得實(shí)現(xiàn)這個(gè)功能的示例。

--

參數(shù): access_type (訪問(wèn)類(lèi)型)
值: online?或 offline(在線或離線)
描述: 表示當(dāng)用戶不在瀏覽器前時(shí),您的應(yīng)用程序是否需要訪問(wèn)谷歌 API。這個(gè)參數(shù)默認(rèn)值是 online。如果您的應(yīng)用程序需要在用戶不在瀏覽器前的時(shí)候刷新訪問(wèn)令牌,那么請(qǐng)使用 offline,這樣做會(huì)讓您的應(yīng)用程序在第一次為用戶獲取授權(quán)碼的時(shí)候獲得一個(gè)刷新令牌。

--

參數(shù): approval_prompt (準(zhǔn)許提示)
值: force?或?auto (強(qiáng)制或自動(dòng))
描述: 決定用戶是否應(yīng)該再次進(jìn)行用戶準(zhǔn)許。默認(rèn)值是 auto(自動(dòng)),表示用戶只需要在第一次權(quán)限請(qǐng)求的時(shí)候看見(jiàn)用戶許可頁(yè)面。如果這個(gè)值是 force(強(qiáng)制),那么用戶即使以前許可了您的應(yīng)用程序的相關(guān)權(quán)限,也會(huì)再次見(jiàn)到用戶許可頁(yè)面。

--

參數(shù): login_hint (登陸提示)
值: 電子郵箱地址或子標(biāo)識(shí)符
描述: 當(dāng)您的應(yīng)用程序知道哪個(gè)用戶正在嘗試進(jìn)行認(rèn)證時(shí),可以提供這個(gè)參數(shù)作為對(duì)認(rèn)證服務(wù)器的提示。將這個(gè)參數(shù)傳過(guò)去會(huì)在登陸頁(yè)面自動(dòng)填寫(xiě)用戶郵箱地址,或者選擇適合的多用戶登錄會(huì)話,從而簡(jiǎn)化登陸工作流。

--

參數(shù): include_granted_scopes (包含已許可的域)
值: true 或 false
描述: 如果這個(gè)參數(shù)值被設(shè)為 true,同時(shí)認(rèn)證請(qǐng)求被許可,那么該次認(rèn)證會(huì)許可所有曾經(jīng)許可給這組用戶和應(yīng)用程序的其他域;請(qǐng)參見(jiàn)漸進(jìn)式授權(quán)。

--

下面是一串示例 URL。(包含換行和空格來(lái)加強(qiáng)可讀性)

 https://accounts.google.com/o/oauth2/auth?
?scope=email%20profile&
?state=security_token%3D138r5719ru3e1%26url%3Dhttps://oa2cb.example.com/myHome&
?redirect_uri=https%3A%2F%2Foauth2-login-demo.appspot.com%2Fcode&,
?response_type=code&
?client_id=812741506391.apps.googleusercontent.com&
?approval_prompt=force

處理回應(yīng)

回應(yīng)會(huì)被發(fā)送到請(qǐng)求 URL 中 redirect_uri?所指定的目的地。如果用戶準(zhǔn)許訪問(wèn)請(qǐng)求,那么回應(yīng)會(huì)包含授權(quán)碼和狀態(tài)參數(shù)(如果請(qǐng)求中有包含狀態(tài)參數(shù)的話)。如果用戶沒(méi)有準(zhǔn)許該次請(qǐng)求,那么回應(yīng)會(huì)包含一個(gè)錯(cuò)誤信息。所有回應(yīng)都會(huì)發(fā)送到查詢串中的 web 服務(wù)器,如下例所示:

一個(gè)包含錯(cuò)誤的回應(yīng):

https://oauth2-login-demo.appspot.com/code?error=access_denied&state=security_token%3D138r5719ru3e1%26url%3Dhttps://oa2cb.example.com/myHome

一個(gè)授權(quán)碼回應(yīng):

https://oauth2-login-demo.appspot.com/code?state=security_token%3D138r5719ru3e1%26url%3Dhttps://oa2cb.example.com/myHome&code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7

重要信息: 如果您接收回應(yīng)的端點(diǎn)會(huì)渲染 HTML 頁(yè)面,那么頁(yè)面的所有資源都可以看見(jiàn) URL 中的授權(quán)碼。其中腳本能直接讀取 URL,頁(yè)面上任何資源都可能收到帶有授權(quán)碼的 URL 的 Referer HTTP頭。請(qǐng)認(rèn)真考慮您是否真的想發(fā)送認(rèn)證憑證給那個(gè)頁(yè)面上的所有資源(特別是第三方腳本,例如社交網(wǎng)絡(luò)插件和統(tǒng)計(jì)分析插件)。若想避免這個(gè)問(wèn)題,我們推薦讓服務(wù)器先單獨(dú)處理請(qǐng)求,然后再重定向到另外一個(gè)不包含回應(yīng)參數(shù)的 URL。

服務(wù)器收到授權(quán)碼后,它就能用授權(quán)碼來(lái)交換一個(gè)訪問(wèn)令牌和一個(gè)刷新令牌。這種請(qǐng)求實(shí)際上是將一個(gè) HTTPS POST 發(fā)送到 URL:https://www.googleapis.com/oauth2/v3/token ,其中包含以下參數(shù):

字段: code (密碼)
描述: 從初次請(qǐng)求獲得的授權(quán)碼

--

字段: client_id (客戶端 ID)
描述:開(kāi)發(fā)者控制臺(tái)處獲得的客戶端 ID。

--

字段: client_secret (客戶端 secret)
描述:開(kāi)發(fā)者控制臺(tái)處獲得的客戶端 secret。

--

字段: redirect_uri (重定向 URI)
描述: 這個(gè)工程在開(kāi)發(fā)者控制臺(tái)處列出的重定向 URI 項(xiàng)之一。

--

字段: grant_type (許可類(lèi)型)
描述: 正如 OAuth 2.0 規(guī)格中定義的,這個(gè)字段必須包含 authorization_code 中的一個(gè)值。

--

實(shí)際請(qǐng)求可能會(huì)像下面這樣:

POST /oauth2/v3/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=8819981768.apps.googleusercontent.com&
client_secret={client_secret}&
redirect_uri=https://oauth2-login-demo.appspot.com/code&
grant_type=authorization_code

一個(gè)針對(duì)這個(gè)請(qǐng)求的成功的回應(yīng)應(yīng)該包含以下字段:

字段: access_token (訪問(wèn)令牌)
描述: 可以發(fā)送給谷歌 API 的令牌。

--

字段: refresh_token (刷新令牌)
描述: 用于獲得新的訪問(wèn)令牌的令牌。刷新令牌會(huì)一直有效直到用戶對(duì)其廢除訪問(wèn)權(quán)。該字段只有在授權(quán)碼請(qǐng)求中的 access_type = offline 的時(shí)候才可能出現(xiàn)。

--

字段: expires_in (有效期)
描述: 訪問(wèn)令牌剩余的生命期。

--

字段: token_type (令牌類(lèi)型)
描述: 確認(rèn)返回的令牌類(lèi)型。在這次示例中,這個(gè)字段總是會(huì)擁有值 Bearer。

--

一個(gè)成功的回應(yīng)會(huì)以 JSON 數(shù)組的形式發(fā)送回來(lái),和下面的例子類(lèi)似:

{
  "access_token":"1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in":3920,
  "token_type":"Bearer"
}

注意: 有時(shí)回應(yīng)可能會(huì)包含其他字段,您的程序不應(yīng)該將這種情況視為錯(cuò)誤。上面示例中的集合是最小集。

調(diào)用谷歌 API

您的程序獲得訪問(wèn)令牌之后,您可以使用令牌以用戶或者服務(wù)賬戶的名義來(lái)對(duì)谷歌 API 進(jìn)行調(diào)用。要做到這一點(diǎn),請(qǐng)將訪問(wèn)令牌包含到發(fā)給 API 的請(qǐng)求中,可以通過(guò)包含 access_token 查詢參數(shù)或者一個(gè) Authorization: Bearer?HTTP 頭來(lái)實(shí)現(xiàn)。如果可能的話,我們更歡迎 HTTP 頭的方法,因?yàn)椴樵兇菀自诜?wù)器記錄中可見(jiàn)。在大多數(shù)情況下你可以使用客戶端庫(kù)來(lái)設(shè)置您的谷歌 API 調(diào)用(例如,當(dāng)對(duì)谷歌人脈 API 進(jìn)行調(diào)用時(shí))。

你可以在OAuth 2.0 游樂(lè)場(chǎng)中自行嘗試所有的谷歌 API 并查看他們所對(duì)應(yīng)的域。

示例

一個(gè)通過(guò)使用 access_token 查詢串參數(shù)對(duì)?people.get?端點(diǎn) (谷歌人脈 API)的調(diào)用會(huì)和下例相類(lèi)似,當(dāng)然在實(shí)際情況中您需要提供您自己的訪問(wèn)令牌:

GET https://www.googleapis.com/plus/v1/people/userId?access_token=1/fFBGRNJru1FQd44AzqT3Zg

而對(duì)于已經(jīng)認(rèn)證的用戶(me)而言,通過(guò) Authorization: Bearer HTTP 頭調(diào)用同樣的 API 就會(huì)像下面這樣:

GET /plus/v1/people/me HTTP/1.1
Authorization: Bearer 1/fFBGRNJru1FQd44AzqT3Zg
Host: googleapis.com

您可以嘗試 curl 命令行應(yīng)用程序。下面是使用 HTTP 頭的方法(推薦)的示例:

curl -H "Authorization: Bearer 1/fFBGRNJru1FQd44AzqT3Zg" https://www.googleapis.com/plus/v1/people/me

或者,您也可以使用查詢串參數(shù)的方法實(shí)現(xiàn):

curl https://www.googleapis.com/plus/v1/people/me?access_token=1/fFBGRNJru1FQd44AzqT3Zg

漸進(jìn)式授權(quán)

在 OAuth 協(xié)議中,您的應(yīng)用程序?yàn)榱嗽L問(wèn)資源所請(qǐng)求的認(rèn)證是以域來(lái)區(qū)分的,如果用戶已經(jīng)被認(rèn)證而且同意權(quán)限請(qǐng)求,您的應(yīng)用程序會(huì)接收到一個(gè)生命期比較短的訪問(wèn)令牌,這些令牌能讓它訪問(wèn)目標(biāo)資源,而刷新令牌(可選)可以讓?xiě)?yīng)用程序擁有長(zhǎng)期的訪問(wèn)權(quán)限。

按需請(qǐng)求資源訪問(wèn)權(quán)限通常被認(rèn)為是一項(xiàng)最佳實(shí)踐。舉例來(lái)說(shuō),一個(gè)讓人們可以對(duì)音樂(lè)進(jìn)行采樣并且創(chuàng)建混音的應(yīng)用程序也許在登陸時(shí)候只需要非常少量的資源,說(shuō)不定除了登陸者的名字之外就沒(méi)別的了。但是,要保存一個(gè)完整的混音可能會(huì)需要訪問(wèn)他們的谷歌網(wǎng)盤(pán)。大多數(shù)人都會(huì)覺(jué)得在應(yīng)用程序需要存儲(chǔ)文件時(shí)申請(qǐng)谷歌網(wǎng)盤(pán)的訪問(wèn)權(quán)限是非常自然的。

這種情況下,在登錄時(shí)應(yīng)用程序可以請(qǐng)求這個(gè)域:https://www.googleapis.com/auth/plus.loginto 來(lái)實(shí)現(xiàn)一個(gè)基本的社交登陸功能,然后在需要保存混音的時(shí)候才申請(qǐng)這個(gè)域:https://www.googleapis.com/auth/drive.file。

同時(shí)使用在使用 OpenID 連接使用 OAuth 2.0 來(lái)訪問(wèn)谷歌 API 里描述的步驟通常會(huì)讓你的應(yīng)用程序不得不管理兩個(gè)不同的訪問(wèn)令牌。如果您希望避開(kāi)這種復(fù)雜性,則需要在所有 OAuth 2.0 工作流的第一步時(shí),將發(fā)送給 https://accounts.google.com/o/oauth2/auth 的認(rèn)證 URI 里添加一個(gè)額外的參數(shù)。這個(gè)參數(shù)是 include_granted_scopes,其中值可以被賦為 truefalse(默認(rèn)值是 false),當(dāng)這個(gè)值為 true 時(shí),如果您的域認(rèn)證要求被批準(zhǔn),谷歌認(rèn)證服務(wù)器會(huì)將這次認(rèn)證和所有之前已經(jīng)成功的認(rèn)證為這組用戶-應(yīng)用程序合并。這類(lèi)請(qǐng)求的 URI 可能看上去會(huì)像下面這樣(下例有插入換行和空格來(lái)增強(qiáng)可讀性):

https://accounts.google.com/o/oauth2/auth?
  scope=https://www.googleapis.com/auth/drive.file&
  state=security_token%3D138r5719ru3e1%26url%3Dhttps://oa2cb.example.com/myHome&
  redirect_uri=https%3A%2F%2Fmyapp.example.com%2Fcallback&
  response_type=code&
  client_id=8127352506391.apps.googleusercontent.com&
  approval_prompt=force&
  include_granted_scopes=true

我們現(xiàn)在把上面這種認(rèn)證叫做“組合認(rèn)證”;關(guān)于組合認(rèn)證:

  • 您可以使用剛才得到的訪問(wèn)令牌來(lái)訪問(wèn)任何在組合認(rèn)證中已經(jīng)合并的域。

  • 當(dāng)您使用刷新令牌來(lái)進(jìn)行組合認(rèn)證時(shí),返回的新訪問(wèn)令牌也代表了組合認(rèn)證,所以也可以用于訪問(wèn)其任意域。
  • 組合認(rèn)證包括了所有過(guò)去已經(jīng)被許可的權(quán)限,即使這些權(quán)限請(qǐng)求曾經(jīng)是從不同的客戶端發(fā)出的。舉例來(lái)說(shuō),如果您在桌面應(yīng)用程序請(qǐng)求了 https://www.googleapis.com/auth/plus.loginscope ,然后又向同一個(gè)用戶的移動(dòng)端發(fā)送了同樣的請(qǐng)求,那么后面這個(gè)請(qǐng)求會(huì)被自動(dòng)批準(zhǔn),因?yàn)榻M合認(rèn)證會(huì)包含兩邊的域。

  • 當(dāng)您廢除了一個(gè)代表組合認(rèn)證的的令牌,其所有的認(rèn)證都會(huì)被同時(shí)廢除;這意味著如果你還保留著任何以往的權(quán)限的令牌,他們也會(huì)跟著失效。

離線訪問(wèn)

在某些情況下,你的應(yīng)用程序可能需要在用戶不在的時(shí)候訪問(wèn)谷歌 API。例如備份服務(wù)或者一些可以讓博客的帖子可以在周一早上準(zhǔn)時(shí)8點(diǎn)鐘發(fā)布的應(yīng)用程序。 這種類(lèi)型的訪問(wèn)被稱作離線的,而 Web 服務(wù)器應(yīng)用程序可能會(huì)向用戶要求離線訪問(wèn)權(quán)。反之,正常和默認(rèn)的情況下訪問(wèn)被稱作在線的。

如果您的應(yīng)用程序需要離線訪問(wèn)谷歌 API,那么在授權(quán)碼的請(qǐng)求中就應(yīng)該包含 access_type 參數(shù),并將其值設(shè)定為 offline。離線訪問(wèn)請(qǐng)求的例子在下方,含有換行和空格來(lái)增強(qiáng)可讀性:

https://accounts.google.com/o/oauth2/auth?
?scope=email%20profile&
?state=security_token%3D138r5719ru3e1%26url%3Dhttps://oa2cb.example.com/myHome&
?redirect_uri=https%3A%2F%2Foauth2-login-demo.appspot.com%2Fcode&
?response_type=code&
?client_id=812741506391.apps.googleusercontent.com&
?access_type=offline

當(dāng)目標(biāo)用戶的瀏覽器第一次被指向這串 URL 時(shí),他們會(huì)看見(jiàn)用戶準(zhǔn)許頁(yè)面。如果他們批準(zhǔn)訪問(wèn),那么回應(yīng)中就會(huì)包含一個(gè)授權(quán)碼,授權(quán)碼可以用來(lái)交換獲得一個(gè)訪問(wèn)令牌和一個(gè)刷新令牌。

下面是授權(quán)碼交換的示例:

POST /oauth2/v3/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=8819981768.apps.googleusercontent.com&
client_secret={client_secret}&
redirect_uri=https://oauth2-login-demo.appspot.com/code&
grant_type=authorization_code

如果這是應(yīng)用程序第一次為用戶進(jìn)行授權(quán)碼交換,那么回應(yīng)中就會(huì)包含一個(gè)訪問(wèn)令牌和一個(gè)刷新令牌,如下例所示:

{
  "access_token":"1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in":3920,
  "token_type":"Bearer",
  "refresh_token":"1/xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI"
}

重要:當(dāng)您的應(yīng)用程序獲得一個(gè)刷新令牌時(shí),將刷新令牌保存起來(lái)供未來(lái)使用時(shí)很重要的。因?yàn)橐坏┠膽?yīng)用程序丟失了刷新令牌,它就只能重新向用戶進(jìn)行用戶準(zhǔn)許才能獲得另一個(gè)刷新令牌了。如果你需要重新向用戶進(jìn)行用戶準(zhǔn)許,請(qǐng)?jiān)谑跈?quán)碼請(qǐng)求里面包含 approval_prompt 參數(shù),并將其值設(shè)定為 force。

您的應(yīng)用程序接收刷新令牌之后,就可以在任意時(shí)間獲得新的訪問(wèn)令牌了。請(qǐng)參見(jiàn)刷新令牌的相關(guān)章節(jié)?來(lái)獲得更多信息。

下一次您的應(yīng)用程序?yàn)橥粋€(gè)用戶請(qǐng)求授權(quán)碼時(shí),用戶不會(huì)再一次被要求同意準(zhǔn)許了(假設(shè)他們以前已經(jīng)同意了這次請(qǐng)求所包含的的域)。和預(yù)料的一樣,回應(yīng)會(huì)包含一個(gè)用于交換的授權(quán)碼。不過(guò),和第一次為用戶交換授權(quán)碼不一樣,返回的內(nèi)容中不會(huì)包括刷新令牌。下面是這類(lèi)請(qǐng)求的一個(gè)示例;

{
  "access_token":"1/fFAGRNJru1FQd77BzhT3Zg",
  "expires_in":3920,
  "token_type":"Bearer",
}

使用刷新令牌

和之前章節(jié)提到的一樣,一個(gè)刷新令牌是在使用參數(shù) access_typeoffline 的第一次授權(quán)碼交換中獲得的。在這類(lèi)情況下,您的應(yīng)用程序可以通過(guò)發(fā)送刷新令牌到谷歌 OAuth 2.0 認(rèn)證服務(wù)器來(lái)獲得一個(gè)新的訪問(wèn)令牌。

若要通過(guò)這種方式獲取訪問(wèn)令牌,您的應(yīng)用程序應(yīng)該發(fā)送一個(gè) HTTPS POST 請(qǐng)求到 https://www.googleapis.com/oauth2/v3/token。 并且請(qǐng)求必須包含以下參數(shù):

字段: refresh_token (刷新令牌)
描述: 從授權(quán)碼交換返回的刷新令牌

--

字段: client_id (客戶端 ID)
描述:開(kāi)發(fā)者控制臺(tái)處獲得的客戶端 ID。

--

字段: client_secret (客戶端 secret)
描述:開(kāi)發(fā)者控制臺(tái)處獲得的客戶端 secret。

--

字段: grant_type (許可類(lèi)型)
描述: 正如 OAuth 2.0 規(guī)格中定義的,這個(gè)字段必須包含 authorization_code 中的一個(gè)值。

--

這種請(qǐng)求如下例所示:

POST /oauth2/v3/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

client_id=8819981768.apps.googleusercontent.com&
client_secret={client_secret}&
refresh_token=1/6BMfW9j53gdGImsiyUH5kU5RsR4zwI9lUVX-tqf8JXQ&
grant_type=refresh_token

只要用戶沒(méi)有廢除您的應(yīng)用程序的訪問(wèn)權(quán)限,回應(yīng)中就會(huì)包括一個(gè)新的訪問(wèn)令牌。對(duì)于上述請(qǐng)求,回應(yīng)應(yīng)該和下例相似:

{
  "access_token":"1/fFBGRNJru1FQd44AzqT3Zg",
  "expires_in":3920,
  "token_type":"Bearer",
}

請(qǐng)注意刷新令牌的發(fā)放數(shù)量是有限制的;限制的單位是每一組客戶端-用戶,你應(yīng)該在長(zhǎng)期存儲(chǔ)器中保存刷新令牌并一直使用它直到過(guò)期。如果您的應(yīng)用程序請(qǐng)求太多刷新令牌,就可能會(huì)觸發(fā)限制,這種情況下最舊的令牌會(huì)失效。

廢除令牌

在某些情況下,一個(gè)用戶也許會(huì)想要廢除已經(jīng)授予給應(yīng)用程序的權(quán)限。用戶可以用過(guò)訪問(wèn)以下 URL 來(lái)顯式地廢除權(quán)限 https://accounts.google.com/b/0/IssuedAuthSubTokens。 同時(shí),通過(guò)編程讓?xiě)?yīng)用程序自行廢除已經(jīng)獲得的權(quán)限也是可能的。程序化廢除工作在用戶取消訂閱或者卸載程序時(shí)是很重要的。換句話來(lái)說(shuō),卸載的過(guò)程可以包含一個(gè) API 請(qǐng)求,用于確保廢除被卸載的應(yīng)用程序已經(jīng)獲得的權(quán)限。

若想程序化廢除令牌,您的應(yīng)用程序需要向 https://accounts.google.com/o/oauth2/revoke?發(fā)送一個(gè)請(qǐng)求,并且將令牌作為參數(shù)發(fā)送出去:

curl https://accounts.google.com/o/oauth2/revoke?token={令牌}

其中的“令牌”可以是訪問(wèn)令牌,也可以是刷新令牌。如果令牌是一個(gè)訪問(wèn)令牌,并且有成對(duì)的刷新令牌,那么所對(duì)應(yīng)的刷新令牌也會(huì)被廢除。

如果廢除工作被成功執(zhí)行,那么回應(yīng)的狀態(tài)碼會(huì)是 200。如果發(fā)生錯(cuò)誤,回應(yīng)的狀態(tài)碼會(huì)是 400,并且回應(yīng)會(huì)包含一個(gè)錯(cuò)誤碼。

注意:?在接收到廢除工作成功的回應(yīng)之后,可能需要隔一段時(shí)間廢除才會(huì)完全生效。

客戶端庫(kù)

下面的客戶端庫(kù)整合了一些流行的框架,讓您更簡(jiǎn)單地應(yīng)用 OAuth 2.0。隨著時(shí)間的推移,會(huì)有更多的新功能添加到這些庫(kù)中。