OAUTH2.0 服务器应该在哪里用于 Google/Firebase 上的操作

Where should the OAUTH2.0 Server be for Actions on Google/Firebase

指的是 - https://developers.google.com/actions/identity/oauth2-code-flow 我正在使用 Actions SDK,这意味着我正在使用 Firebase 函数进行履行处理。

我将信息存储在 Firebase 中,与我从 Android 应用中的 FirebaseUser.getUid() 获得的 UID 相对应。到目前为止一切顺利。

我设置了一个模拟 OAuth2.0 服务器,这似乎很适合交换令牌。

但是稍后在文档中指出:

"Your service's API endpoints use the access token to identify the user on whose behalf Google is making the API call, and to verify that Google has authorization to access the endpoint on the user's behalf."

然而,我的实现是在 Firebase 函数中。所以...

我是否需要让我的 FirebaseFunction 从 OAuth2.0 服务器获取用户 ID?我需要在 Firebase Functions 中设置 OAuth2.0 服务器吗? OAuth2.0 服务器位于何处?以及如何让我的 Firebase 函数获得与 Android 报告的用户 ID 相同的用户 ID?

首先 - 你从一个小的误解开始。 Google 上的操作和 Actions SDK 需要 Firebase 函数来实现。 Firebase Functions do 使它变得更容易 - 它们提供了 public webhook 所需的可访问 HTTPS 端点,但如果您有自己的服务器(具有有效的 SSL 证书)或如果你想使用 AWS Lambda 或类似的东西,你当然可以这样做。如果您想使用 JavaScript 以外的语言,所使用的 JSON 协议已记录在案(尽管有时不清楚)。

回答您的问题:

如果您的 webhook 中需要 UserID,那么是的,它需要一些方法来获取该 UserID 给定的访问令牌。但是如何执行此操作取决于您如何实现 OAuth 服务器和令牌。例如:

  • 如果您使用签名的 JTW 作为令牌,则 UserID 是 JWT 的一部分,您的 webhook 需要做的就是提取它并验证 JWT 上的签名和时间范围是否有效。您无需联系任何其他服务器即可执行此操作。

  • 如果您将令牌和相应的用户信息存储在 Firebase 或某些其他数据库或数据存储中 - 只需从您的网络钩子中读取令牌!

  • 您当然可以创建另一个 HTTPS 端点,您可以使用它来验证令牌并从中获取信息 - 例如,Google 就是这样做的。

您的 OAuth 服务器 不需要 比您的网络钩子更需要存在于 Firebase Functions 中。它可能是一个适合它的地方(以及 Firebase 托管上的身份验证页面),但这不是必需的。

您的 OAuth 服务器可以位于...任何地方。好吧,只要有有效的 SSL 证书,Internet 上的任何地方 public。

最后一点正是帐户链接的全部内容。您需要确保,当他们针对您的服务器进行身份验证时,您获得的 UserID 是 "reported by Android",无论这在您的上下文中意味着什么(但请参阅下面的更新)。获得此 UserID 后,您需要确保它与您为该用户颁发的任何令牌相关联,并且您需要为您的服务提供一种从令牌中获取此 UserID 的方法。

您如何执行此操作取决于您自己,并且取决于您的体系结构的其余部分以及您尝试使用它做什么。 Google 助手不关心 - 它有自己的 UserId 概念,与您的不同,因此要使用您的 UserId 识别用户,您将使用它提供给您的令牌。

更新

你在关于 statement "The user ID on Android devices will also be the same as the user ID on a Google Home". This is true, but talks about the anonymous cookie-like UserID that is available through the Assistant platform only (which is why it is in the section on Anonymous User Identity). It doesn't talk about any ID that you can get through other Android apps. To associate the ID you get through other apps to the Assistant's ID, you need to use Account Linking as described on the following page 的评论中提出了一个很好的观点。

如果您只需要一种一致的方式来跟踪多次访问您的操作的用户,并且您希望这种方式在任何 Google 助理平台上都保持一致(Google 主页,Android 的 Google 助理,或 iOS 的助手),那么您只需使用通过 API/JSON 提供的用户 ID。您不需要帐户链接或 OAuth 服务器。但这不是 Google ID 或 Firebase ID,它是仅在 Google 助理平台上有效的匿名用户 ID(然后,仅在特定条件下,如果用户未重置它)。

更新 2要清楚 OAuth 和 JWT:

你在问题中提问"Where else can I get the JWT?"

简而言之 - 您自己构建。

请记住,如果您要提供 OAuth 服务器,您需要做的其中一件事就是颁发授权令牌和刷新令牌。这些令牌可以是您想要的任何东西 - 唯一的标准是您的 webhook 能够获取令牌,并以某种方式从中获取将其与用户相关联的信息。

但是首先负责将这些信息放在那里。

因此,当用户在帐户链接期间登录时,您可以使用 Firebase 身份验证让他们登录。完成后,您可以获得一个 Firebase ID and/or 一个 Google ID为他们。 (毕竟,他们已经登录到您的 OAuth 网页 - 您必须对他们有所了解。)

他们登录后,您将他们重定向到 Google 要求的某个地方,并且您将令牌作为其中的一部分。该令牌可以是您正在创建的 JWT,并且在该 JWT 中,您可以包含您从他们的登录中获得的 ID 信息。

(而且,再次...它不必是 JWT。它可以是您想要的任何东西。唯一的要求是您能够验证它并使用它来获取您需要的信息。 )