2008-12-11 193 views
73

如何驗證Google身份驗證訪問令牌?如何驗證Google身份驗證API訪問令牌?

我需要以某種方式查詢Google並詢問:給定的訪問令牌對於[[email protected]] Google帳戶有效嗎?

短版
很清楚如何通過Google Authentication Api :: OAuth Authentication for Web Applications提供的訪問令牌可以用來然後從一系列谷歌服務請求數據。目前尚不清楚如何檢查給定的訪問令牌對於給定的Google帳戶是否有效。我想知道如何。

長版本
我正在開發一個使用基於標記的身份驗證的API。在提供有效的用戶名+密碼或從可用於驗證的服務 N中提供第三方令牌時,將返回令牌。

其中一項第三方服務是Google,允許用戶使用他們的Google帳戶對我的服務進行身份驗證。這將在以後擴展到包括雅虎帳戶,可信的OpenID提供商等等。基於谷歌的訪問

原理例如:

alt text http://webignition.net/images/figures/auth_figure002.png

的 'API' 實體是我的完全控制之下。 '公共接口'實體是任何基於網絡或桌面的應用程序。一些公共接口在我的控制之下,其他的不會,而其他的我也許永遠不會知道。

因此,我不能相信在步驟3中提供給API的令牌。它將隨相應的Google帳戶電子郵件地址一起提供。

我需要以某種方式查詢Google並詢問:此訪問令牌是否對[email protected]有效

在這種情況下,[email protected]是Google帳戶唯一標識符 - 用戶用於登錄其Google帳戶的電子郵件地址。這不能被認爲是Gmail地址 - 某人可以擁有Google帳戶,而無需擁有Gmail帳戶。

Google文檔清楚地說明了如何使用訪問令牌從多個Google服務中檢索數據。似乎沒有什麼可以說明如何檢查給定的訪問令牌是否有效。

更新 該令牌對N個Google服務有效。我無法嘗試使用Google服務的令牌作爲驗證方式,因爲我不知道給定用戶實際使用的所有Google服務的哪個子集。

此外,我永遠不會使用Google身份驗證訪問令牌來訪問任何Google服務,只是作爲驗證所謂的Google用戶實際上是他們所說的人的手段。如果還有其他的方式,我很樂意嘗試。

+0

什麼特定的認證服務是這個問題(OAut h,AuthSub,安裝的應用程序,...)?請提供更詳細的鏈接。 – 2008-12-11 15:06:59

+0

@Martin v。Löwis:「Web應用程序的OAuth身份驗證」服務 - 我已更新問題的開頭部分以反映此問題。感謝您指出了這一點! – 2008-12-11 15:26:12

+0

關於谷歌密鑰驗證的有趣文章可能會提供更多見解http://groups.google.com/group/Google-Maps-API/msg/f9e3c5ad3cbda4d7 – dotjoe 2008-12-31 18:04:32

回答

-1

嘗試進行有效的請求並檢查無效的令牌響應。

-1

谷歌無法回答你的問題,因爲它不是「這個訪問令牌有效嗎?」這是令人信服的祕密。

1

我需要以某種方式查詢Google並詢問:該訪問令牌是否對[email protected]有效?

不需要。您需要的只是從您的API域請求標準登錄Federated Login for Google Account Users。只有在此之後,您纔可以將「永久性用戶ID」與「公共界面」中的一個進行比較。

在Google聯合登錄頁面上使用領域的值來向用戶標識請求網站。它也用於確定Google返回的持久用戶標識的值。

所以你需要來自同一個域作爲'公共接口'。

並且不要忘記用戶需要確保您的API可以被信任;所以Google會詢問用戶是否允許您檢查他的身份。

0

嘗試使用您的令牌對https://www.google.com/accounts/AuthSubTokenInfo進行OAuth認證的請求。這僅記錄在AuthSub中,但它也適用於OAuth。它不會告訴你該令牌是用於哪個用戶,但它會告訴你它對哪些服務有效,並且如果令牌無效或已被撤銷,請求將失敗。

0

任意OAuth訪問令牌不能用於身份驗證,因爲令牌的含義不在OAuth Core規範中。它可以用於單次使用或縮短到期時間窗口,或者可以提供用戶不想提供的訪問。它也是不透明的,獲得它的OAuth消費者可能永遠都看不到任何類型的用戶標識符。

一個OAuth服務提供者和一個或多個消費者可以很容易地使用OAuth提供可驗證的認證令牌,並且有提案和想法可以做到這一點,但任意服務提供者只會說OAuth Core無法提供此沒有與消費者的其他協調。特定於Google的AuthSubTokenInfo REST方法與用戶標識符關係密切,但也不合適,因爲它可能使標記無效,或者標記可能過期。

如果您的Google ID是OpenId標識符,並且您的「公共界面」既可以是網絡應用,也可以調用用戶的瀏覽器,那麼您應該使用Google的OpenID OP。

OpenID包括只發送用戶到OP和得到一個簽名的斷言回來。互動完全是爲了RP的利益。沒有長壽命的令牌或其他用戶特定的句柄可用於指示RP已成功通過OP對用戶進行身份驗證。

假設使用相同的用戶代理,驗證以前的身份驗證與OpenID標識符的一種方法是隻需再次執行身份驗證。 OP應該能夠在沒有用戶交互的情況下返回肯定的斷言(例如,通過驗證cookie或客戶端證書)。 OP可以自由地要求另一個用戶交互,並且如果認證請求來自另一個域(我的OP讓我可以選擇在未來不進行交互的情況下重新認證這個特定的RP),可能會發生。而在Google的情況下,用戶通過獲取OAuth令牌的UI可能不會使用相同的會話標識符,因此用戶必須重新進行身份驗證。但無論如何,你都可以斷言身份。

+0

Google已拒絕OpenID 2.0並將其禁用,以支持基於OAuth的OpenID Connect提供[可驗證的id令牌](http://stackoverflow.com/a/31597027/603516)。 – Vadzim 2015-07-23 20:12:18

14
function authenticate_google_OAuthtoken($user_id) 
{ 
    $access_token = google_get_user_token($user_id); // get existing token from DB 
    $redirecturl = $Google_Permissions->redirecturl; 
    $client_id  = $Google_Permissions->client_id; 
    $client_secret = $Google_Permissions->client_secret; 
    $redirect_uri = $Google_Permissions->redirect_uri; 
    $max_results = $Google_Permissions->max_results; 

    $url = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token='.$access_token; 
    $response_contacts = curl_get_responce_contents($url); 
    $response = (json_decode($response_contacts)); 

    if(isset($response->issued_to)) 
    { 
     return true; 
    } 
    else if(isset($response->error)) 
    { 
     return false; 
    } 
} 
80

對於用戶檢查,只是張貼 獲得訪問令牌的accessToken和發佈,並得到響應

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=accessToken 

你可以在瀏覽器的地址欄中嘗試過,用httppost和java的響應也

響應會像

{ 
    "issued_to": "xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com", 
    "audience": "xxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com", 
    "user_id": "xxxxxxxxxxxxxxxxxxxxxxx", 
    "scope": "https://www.googleapis.com/auth/userinfo.profile https://gdata.youtube.com", 
    "expires_in": 3340, 
    "access_type": "offline" 
    } 

範圍是accessToken的給定權限。你可以檢查的範圍IDS在this link

0

下面是一個使用Guzzle一個例子:

/** 
* @param string $accessToken JSON-encoded access token as returned by \Google_Client->getAccessToken() or raw access token 
* @return array|false False if token is invalid or array in the form 
* 
* array (
* 'issued_to' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com', 
* 'audience' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com', 
* 'scope' => 'https://www.googleapis.com/auth/calendar', 
* 'expires_in' => 3350, 
* 'access_type' => 'offline', 
*) 
*/ 
public static function tokenInfo($accessToken) { 
    if(!strlen($accessToken)) { 
     return false; 
    } 

    if($accessToken[0] === '{') { 
     $accessToken = json_decode($accessToken)->access_token; 
    } 

    $guzzle = new \GuzzleHttp\Client(); 

    try { 
     $resp = $guzzle->get('https://www.googleapis.com/oauth2/v1/tokeninfo', [ 
      'query' => ['access_token' => $accessToken], 
     ]); 
    } catch(ClientException $ex) { 
     return false; 
    } 

    return $resp->json(); 
} 
2

Google oauth code flow response除了access_token也返回id_token包含用於以加密形式驗證信息是有用的。

讓ID標記有用的一件事是,您可以通過 將它們傳遞給應用程序的不同組件。這些組件可以使用ID令牌作爲輕量認證機制,認證應用程序和用戶的 。但是,在使用ID 令牌中的信息或依賴它作爲用戶已認證的斷言之前,您必須先驗證它。

ID令牌的驗證需要以下幾個步驟:

  • 驗證ID令牌是正確與合適的谷歌公共密鑰簽署了JWT。
  • 驗證ID令牌中的aud值等於您應用的客戶端ID。
  • 驗證ID令牌中的iss值等於accounts.google.com或https://accounts.google.com
  • 驗證ID令牌的到期時間(exp)未通過。
  • 如果您在請求中傳遞了一個hd參數,請驗證該ID令牌具有與您的Google Apps託管域匹配的hd聲明。

https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtoken鏈接具有驗證ID令牌的代碼示例。

另請參閱https://security.stackexchange.com/questions/37818/why-use-openid-connect-instead-of-plain-oauth

3

好吧,大多數答案是有效的,但不完全正確。智威湯遜的想法是,您可以驗證令牌,而無需每次聯繫發行人。您必須檢查id並使用用於簽署令牌的Google證書的已知公鑰驗證令牌的簽名。

看到下一篇文章爲什麼以及如何做到這一點。

http://ncona.com/2015/02/consuming-a-google-id-token-from-a-server/