Google上的操作 - 为UID登录和交换访问令牌

时间:2017-10-19 10:05:59

标签: firebase oauth firebase-authentication actions-on-google

我需要检查一下我是否正确。我正在使用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令牌,但是因为看起来你可以轻松地在互联网上使用JWT解码器来提取所有信息,所以它真的与安全点没什么不同观点 - 我不妨在这里看看。

看起来管理方面的东西在Node.js和PHP中可用,我可以连接到数据库并验证令牌和创建用户,但我无法登录。所以JavaScript似乎还有很长的路要走。

我收集的下一步是将我的uid发回oauth服务器,以便我们知道我们登录的是谁,我们可以将oauth访问令牌/刷新令牌/身份验证代码绑定到uid。无论我们将该链接存储在Firebase中还是存储在Oauth服务器上的MySQL数据库中,它都无关紧要。

然后,为了在Firebase功能中实现,我们有一个userId到:

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

但这与我们从结果中检索到的uid不匹配...但我们确实可以访问我们在Oauth服务器上生成的AccessToken,因此我们需要为正确的uid交换访问令牌 - 无论我们是否从中查找Firebase或OAuth MySQL服务器我觉得无所谓。

把它们放在一起,这一切都是正确的吗?或者有什么可以做得更好?我希望有更好的方法来识别Firebase功能中的用户。但这似乎不可能。

1 个答案:

答案 0 :(得分:3)

我认为你大多数都是正确的(假设我遵循了所有内容),但需要注意几点:

  1. 您应仅将UserID从客户端发送到您的服务器。

    正如您所注意到的那样,这些信息很容易被......好吧......任何人。这意味着,除非您小心,否则任何人都可以向您的服务器发送他们从其他地方获得的用户ID,并伪装成您。

    使用JWT令牌可提供更高的安全性。虽然它包含UserID,但它还包含该信息的签名哈希,因此您可以验证该信息是否有效。它还包含到期日期,因此如果它超出有效范围,您可以拒绝它。这使得某人伪造用户ID或重新使用他们获得的用户ID变得更加困难。

    您应该采取其他预防措施。我们无法真正信任浏览器,但我们可以缩小解决问题的机会。

  2. 您更正了,智能助理发送的用户ID与任何地方的任何其他用户ID完全没有任何关系。它可以作为一个类似匿名cookie的引用,所以你知道你是否两次获得相同的UserID ......另一端的人可能是相同的。它主要用于简单使用而非真正的身份验证,当然也不用于授权。

  3. 如果您执行想要进行身份验证和授权,那么帐户关联过程,您的OAuth服务器以及为您提供身份验证令牌的原因非常重要。您有这个部分是正确的 - 您需要验证令牌是否有效(以帮助减少其他人不假装成助理的机会)并使用它来确定ID。

    在数据库中查找是一个选项,但是将令牌作为您自己的JWT发布是另一种选择。鉴于设置听起来像你描述的那样,在某种数据存储中管理它是最有意义的。