2013-05-01 25 views
11

我正在嘗試爲Android平臺的自定義node.js服務器api驗證移動應用程序。我希望爲此使用Google OAuth2令牌,而不是推出自己的身份驗證,因爲安裝了Google Play的Android設備可將其用於應用程序開發人員。我正在使用來自Google Play服務庫的GoogleAuthUtil.getToken來電,記錄爲here。我試圖按照這個android developers blogpost在Node.js服務器中驗證Google授予OAuth令牌的正確方法是什麼?

概述的建議getToken方法返回我的情況下長857字節的字符串。如果我嘗試這個令牌傳遞到谷歌的TokenInfo端點,它返回:

{ '錯誤': 'INVALID_TOKEN', 'ERROR_DESCRIPTION': '無效值'}

我在做什麼錯這裏?在getToken調用的'範圍'中,我發送: audience:server:client_id:**i_put_my_clientid_here**。我爲「安裝的應用程序」生成了一個clientid。使用這個客戶端ID,對getToken的調用完全不起作用。當我爲「服務帳戶」生成一個客戶端ID時,調用成功,但是如上所述,當傳遞給TokenInfo端點時,我得到一個857字節的令牌失敗。

編輯: 我還爲「web應用程序」創建了一個客戶端ID,因爲它看起來是調用getToken時要使用的正確客戶端ID。但行爲是一樣的,我得到一個857字節的令牌,在調用Google的端點時不會生效。

如何在Android上使用Google Play服務正確獲取有效的身份驗證令牌?一旦我有正確的標記,什麼是正確的node.js庫來驗證它的服務器端?我可以使用passport-google-oauth嗎?

回答

3

如果您只是想讀取GoogleAuthUtil.getToken返回的數據內容,那麼這個過程非常簡單。返回的數據只是一個智威湯遜。所以你只需要用.這個字符來分割數據,然後用base64(url)解碼每一塊。

如果您想要驗證郵件的真實性,它會變得稍微複雜一點。只需使用您最喜歡的加密庫進行驗證即可。 JWT的第三部分是數據的簽名和the Google certs are publicly available;這就是你需要驗證信息的全部內容。

+0

我已經提取了三部分,需要驗證id_token。 SHA256(頭+「。」+有效載荷)是否等於解密的簽名?或者,解密後的簽名僅等於有效負載的哈希值?在數據獲取Base64編碼之前它是否相等?我的功能與谷歌證書令牌非常不起作用,所以我只是想知道。謝謝 – kingSlayer 2014-08-11 17:10:36

+0

簽名是爲sha256(頭+「。」+有效載荷) – George 2014-08-12 19:30:33

1

我不太熟悉Android如何將令牌從設備傳遞到服務器的細節。然而,我的一般印象是,你不會經歷典型的基於網絡的OAuth舞蹈。而是直接調用「用戶信息」端點,該端點將返回與持有令牌的用戶相對應的信息,或者如果令牌無效,則拒絕該請求。這裏也有一些討論此相關的問題:

validating Android's authToken on third party server

實際上,令牌將被設備和服務器之間都共享的祕密,所以它的重要,以保護它。

有一些開發,以從iOS設備做使用令牌類似的事情了Facebook和Twitter的幾個策略:

https://github.com/drudge/passport-twitter-token
https://github.com/drudge/passport-facebook-token

您可以從他們一些啓發,並調整它說話到Google的終端。讓我知道結果如何。我很想看到一個類似的「護照 - 谷歌令牌」策略,所以如果你實施一個,讓我知道,我會鏈接到它!

+0

我或多或少試圖跟隨流此處概述:http://android-developers.blogspot.com/2013/01/verifying-back-end-calls- from-android.html。在Android設備上,您已經對自己的Google帳戶進行了身份驗證。 Google Play服務實施使用這個事實來繞過其他一些工作流程步驟。我可以從Google獲得一個授權令牌,理論上Google允許我在沒有服務器調用的情況下進行驗證。但我得到的令牌迄今被認爲是無效的。它也似乎太長(857字節)。 – 2013-05-01 20:48:06

+0

如果Google的回覆是JWT,並且可以在https://www.googleapis.com/oauth2/v1/certs上獲得Google使用的證書,那麼我可以使用https://github.com/xtuple/passport -oauth2-jwt-bearer來驗證這些令牌,而不必在我的服務器端調用谷歌? – 2013-05-01 23:17:19

+0

我相信oauth2-jwt-bearer用於實現OAuth 2.0服務器的情況。我會看看以下內容:https://github.com/mozilla/jwcrypto https://github.com/brianloveswords/node-jwa https://github.com/brianloveswords/node-jws – 2013-05-02 00:38:19

4

嗯,這的確是一個評論,而不是一個答案,但我不能把換行符那些:

  1. 它是網絡側克倫特的ID去在put_my_clientid_here點
  2. 如果GoogleAuthUtil。getToken()爲您提供一個String,並拋出一個Exception,它真的應該是有效的。當你點擊tokeninfo,你是否使用... tokeninfo?id_token = < 857字節值 - 在這裏>
  3. 如果你是一個rubyist,抓住google-id令牌寶石,看看它是否可以驗證你的857字節標記。
+0

是的! id_token工作。我之前使用過access_token。我在哪裏可以找到一些很好的解讀差異的解讀?現在我只需要找到正確的方法來在Node.js服務器中驗證它們,而不必每次調用Google的端點。爲此,賈爾德更平。謝謝! – 2013-05-01 21:39:37

+0

使用google-id令牌gem,推測「觀衆」參數可以獲取網絡端客戶端ID。但是什麼進入了required_client_id參數?我試着用我的「安裝的應用程序」ID,但它不起作用 - 無論安裝的應用程序客戶端ID是否未用於使用getToken生成id_token。 – 2013-05-02 00:34:06

2

一個星期我一直在尋找到如何驗證令牌GoogleAuthUtil使用passport.js

收到的Android客戶端應用程序在服務器的Node.js最後我碰到護照谷歌令牌護照,其完美的執行策略來任務。

https://www.npmjs.com/package/passport-google-token

更多細節存在於上述鏈接。

+0

雖然這可能在理論上回答這個問題,[這將是可取的](http://meta.stackoverflow。com/q/8259)在這裏包括答案的基本部分,並提供參考鏈接。 – Yuriy 2015-03-27 07:12:21

相關問題