[英]How do I validate a client-side google+ login?
因此,按照此處的基本教程 ( https://developers.google.com/+/web/signin/javascript-flow ),您可以輕松地為 google 帳戶添加客戶端登錄。
通過修改代碼查詢/people/me,如下:
function signinCallback(authResult) {
if (authResult['status']['signed_in']) {
gapi.auth.setToken(authResult);
gapi.client.load('plus','v1', function(){
var request = gapi.client.plus.people.get({
'userId': 'me'
});
request.execute(function(resp) {
console.log(resp);
});
});
}
您可以訪問基本帳戶信息; 用戶 ID、圖像、名稱等。
您還有來自 oauth 登錄名的有效訪問令牌。
現在,除非您有一個完全客戶端的應用程序,否則您將不得不通知服務器用戶已登錄,以獲取該用戶的應用程序數據。
我想要做的是 POST 到 /login/gauth {'access_token': ..., 'user_id': ....} 它將響應一個 auth cookie 並重定向回來; 除了現在我們有一個持久的本地身份驗證令牌,我們可以用它來識別用戶。
在服務器上,我需要做的是使用訪問令牌訪問相同的 REST api (/people/me),並驗證它返回的用戶 ID; 任何其他提供的信息都可以在客戶端偽造。
問題是,我在服務器端找不到任何驗證/使用訪問令牌的方法。
我可以在服務器上設置一個新的 OAuth 登錄,並執行僅服務器登錄過程,但這相當復雜,而且考慮到我已經有一個有效的訪問令牌,這似乎很浪費。
我如何使用它?
您可能想要使用https://developers.google.com/+/web/signin/server-side-flow 中概述的混合流程。 在此流程中,您的客戶端執行的操作與現在大致相同,但您的客戶端還會獲得一個短期“代碼”,它應該通過安全通道將其傳遞給服務器。 然后,服務器根據服務器驗證這一點,以獲得自己的訪問(可能還有刷新)令牌。 這比客戶端嘗試發送 access_token 更安全,因為它減少了中間人可以利用它的窗口,並且只能使用一次,從而減少了機會。
接受的答案中的細節是正確的,但有一種更簡單的方法,它只是含糊地暗示,而不是實際陳述,但如果您仔細閱讀,它會出現在示例代碼中。
關鍵是:
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=TOKEN
當 TOKEN 是客戶端訪問令牌時。 這將返回一個像這樣的 json 塊:
{u'access_type': u'online',
u'audience': u'...',
u'expires_in': 3475,
u'issued_to': u'...', <--- The client ID; use this to verify access token
u'user_id': u'1234567890', <--- The unique google user id
u'scope': u'https://www.googleapis.com/auth/userinfo.profile')
請注意,這只是驗證:
如果要查詢有關用戶的其他詳細信息,則需要使用 OAuth 庫之一。
在許多情況下,這可能足以唯一標識用戶。
您可以通過驗證服務器上用戶 JWT id_token
的真實性,跳過向tokeninfo
端點發出網絡請求。 這可以通過使用 Google 的 API 客戶端庫之一輕松完成。
這也使您可以避免在不需要時請求離線訪問代碼。
這是 Google文檔中推薦的方法。
檢查那里以獲取更詳細的說明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.