2

我正在开发一个网络服务,我希望我的用户使用一些已知的身份验证提供程序(facebook、google 等)登录,而不是注册一个新用户。

我将以堆栈溢出作为此类服务的示例。

根据我阅读 O-Auth 教程的理解,流程应该是这样的:

1. A user log in for the first time to Stack Overflow
2. User is asked to log in via Google or Facebook.
3. Stack overflow redirects the user to Google along with Stack Overflow app ID and a Redirect URL (Callback)
4. Google ask the user: "Stack overflow wants to access your account" - allow/deny. 
5. Assuming the user allowed, Google will redirect the user back to Stack Overflow, and will send a Token back to stack overflow servers (the Callback URL) as well as a client ID (unique google id)
6. If this client id does not exists, Stack overflow creates a new user in its database with this client id, if it does exists, it will just return the user's data (e.g. questions asked)
7. Using the saved TOKEN, stack overflow servers can grab information from Google (if needed) without the user interaction (since the user allowed access to Google)

这个流量准确吗?如果是这样,这是主要问题。

客户端

客户现在想要向/从 Stack Overflow 发送/接收信息(例如发布问题)。

  • 客户端需要向 Stack 溢出服务器发送什么样的信息,以便他们确认这确实是用户?

服务器端

  • Stack如何溢出,验证这个用户?(即 Stack Overflow 会在用户身上保存什么样的信息来识别他?Google/Facebook ID?)

  • Stackoverflow 服务器想要从用户的 Google 帐户中获取信息(用户允许此操作),stackover flow 服务器需要向 Google 发送什么样的信息才能检索此信息。

4

1 回答 1

0

我认为你的假设大多是准确的。不过有一个例外:

5)假设用户被允许,谷歌会将用户重定向回 Stack Overflow,并将一个 Token 发送回 Stack Overflow 服务器(回调 URL)以及一个客户端 ID(唯一的 google id)

通常,OAuth2 服务器不返回 clientId 或任何用户详细信息,它只返回令牌。实际上,oauth 客户端(即您的示例中的 stackoverflow)根本不应该知道用户身份。OAuth2 旨在允许客户端访问受限资源而无需获取用户身份。

但是,如果客户端(stackoverflow)要求访问用户帐户(如您的示例中),它可以在之后使用令牌查询一些用户详细信息。用户详细信息(例如标识符)完全取决于授权服务器(例如 Google)。即使服务器在查询结果中提供了此类内部详细信息,您(stackoverflow)仍应仅根据普遍可用的、与提供商无关的信息生成 clientId,例如使用电子邮件地址。

这也应该回答了您的两个服务器端问题。

客户端需要向 Stack 溢出服务器发送什么样的信息,以便他们确认这确实是用户?

对于场景的其余部分,角色应该完全颠倒。Google 超出了范围,Stackoverflow 将成为 OAuth2 SERVER,而您的应用程序将成为 CLIENT。如果您的应用程序想要发布或阅读问题,它应该需要 stackoverflow 用户的授权才能这样做。如果授权被授予,则返回一个令牌,您的应用程序应使用该令牌访问 Stackoverflow 上的问题。所以答案是:什么都没有,只有令牌。

为了正确完成答案,我不得不承认我对上述网站(google.facebook、stackoverflow 等)的实现细节并不十分熟悉。但如果它们符合 OAuth2 标准,它们的行为应该与我所描述的一样。熟悉的用户,如果任何站点的场景实施方式不同,请告诉我!

于 2012-10-29T15:01:58.593 回答