谷歌 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="" />
用于認(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)會(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ò)誤。上面示例中的集合是最小集。
您的程序獲得訪問(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
在 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
,其中值可以被賦為 true
或 false
(默認(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)合并的域。
組合認(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ì)包含兩邊的域。
在某些情況下,你的應(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_type
為 offline
的第一次授權(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ù)整合了一些流行的框架,讓您更簡(jiǎn)單地應(yīng)用 OAuth 2.0。隨著時(shí)間的推移,會(huì)有更多的新功能添加到這些庫(kù)中。