簡體   English   中英

Google上的操作-登錄和交換UID的訪問令牌

[英]Actions on Google - Login and Swapping Access Token for UID

我需要檢查我是否擁有此權利。 我使用Actions-SDK在Google上構建了Action。 對於身份驗證,我想使用Google登錄功能為最終用戶保持相對簡單的狀態。 我的成就將坐在Firebase功能上。 我的OAUTH服務器將位於Firebase之外。

我要注意的第一件事是,大多數前端登錄都是使用JavaScript完成的。

var provider = new firebase.auth.GoogleAuthProvider();

從這里,如果用戶登錄,我們可以使用:

firebase.auth().getRedirectResult().then(function(result) { } ,我們可以訪問result.user.uid

我的第一個問題是安全性-因為API KeyDatabaseURLauthDomain在客戶端JavaScript中公開,並且使用Chrome中的開發人員控制台,最終用戶可以訪問其ID和令牌。 我想知道是否出於某種原因在result.user.De下使用uid或id令牌,但是看起來您可以輕松地在Internet上使用JWT解碼器提取所有信息,因此與安全點實際上並沒有什么不同的觀點-我不妨將uid放在這里。

看起來管理方面可以在Node.js和PHP中找到,我可以連接到數據庫並驗證令牌並創建用戶,但無法登錄。 因此,JavaScript似乎是必經之路。

我收集的下一步是將uid重新發布到oauth服務器,以便我們知道以誰身份登錄,並且可以將oauth訪問令牌/刷新令牌/ auth代碼綁定到uid。 無論我們將鏈接存儲在Firebase還是Oauth服務器上的MySQL數據庫中,都沒有關系。

然后為了實現Firebase Functions,我們通過以下方式獲得一個userId:

let ActionsSdkApp = require('actions-on-google').ActionsSdkApp;
const app = new ActionsSdkApp({request: request, response: response});
app.getUser().userId);

但這與我們從結果中檢索到的uid不匹配...但是我們確實可以訪問在Oauth服務器上生成的AccessToken,因此我們需要將Access Token交換為正確的uid-無論是從Firebase還是從Firebase中查找我猜OAuth MySQL Server沒關系。

放在一起,這一切聽起來是否正確? 還是有什么可以做得更好的? 我希望在Firebase Functions中有更好的識別用戶的方法。 但這似乎不可能。

我認為您基本上是正確的(假設我遵循了所有內容),但有幾點需要注意:

  1. 應該從客戶端只發送用戶ID到服務器。

    如您所見,任何人都可以輕松獲取這些信息。 這意味着,除非您小心,否則任何人都可以向您的服務器發送他們從其他地方獲得並假裝為您的UserID。

    使用JWT令牌可以提供更多的安全性。 盡管它包含UserID,但它也包含該信息的簽名哈希,因此您可以驗證該信息是否有效。 它還包含一個到期時間,因此如果它在有效范圍之外,則可以拒絕它。 這使得某人偽造一個UserID或重復使用他們獲得的ID變得更加困難。

    您還應遵循這些預防措施。 我們不能真正信任瀏覽器,但是可以縮小出現問題的機會。

  2. 沒錯,助手發送的UserID與任何地方的任何其他UserID都沒有任何關系。 它打算用作匿名的類似cookie的引用,因此您知道是否兩次獲得相同的UserID ...另一端的人可能是相同的。 它主要是為了簡單使用而不是真正的身份驗證,當然也不是為了授權。

  3. 這就是為什么連接過程中,您的OAuth服務器,交給你一個身份驗證令牌帳戶是非常重要的,如果想要做的認證和授權。 您的部分正確無誤-您需要驗證令牌是否有效(以幫助減少其他人不假裝成為助手的機會)並使用它來確定ID。

    在數據庫中查找它是一種選擇,但是發行令牌作為您自己的JWT是另一種選擇。 聽起來像您描述的那樣,在某種數據存儲中進行管理最有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM