我正在开发一个网络服务,我希望用户使用一些已知的身份验证提供商(Facebook,Google等。)登录,而不是注册新用户。/p>
我将以堆栈的溢出为例。
从我从阅读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)
这个流程是准确的吗?如果是这样,这是主要问题。
客户端
客户现在想将信息发送/接收到/从堆栈溢出(例如,发布问题)。
- client 需要发送什么样的信息,需要发送到堆栈溢出服务器,以确认这确实是用户?
服务器端
堆栈溢出如何验证此用户?(即,堆栈溢出保存在用户身上以识别他?Google/facebook ID?)
堆栈溢出服务器希望从用户的Google帐户中获取信息(用户允许此操作),堆栈流服务器需要发送什么样的信息才能发送Google以检索此信息。
i您的假设大多是准确的。但是有一个例外:
5)假设允许用户,Google将将用户重定向回堆栈溢出,并将令牌发送回堆栈溢出服务器(回调URL)以及客户端ID(唯一的Google ID)
>
通常,OAuth2服务器不会返回客户端或任何用户详细信息,它仅返回令牌。实际上,OAUTH客户端(即示例中的stackoverflow)根本不知道用户身份。OAuth2旨在启用无需获得用户身份的客户访问限制资源。
但是,如果客户端(stackoverflow)要求访问用户帐户(如示例中),则可以使用令牌查询某些用户详细信息。用户详细信息(例如标识符)完全取决于授权服务器(即Google)。即使服务器在查询结果中提供了此类内部详细信息,您(stackoverflow)仍然应该基于普遍可用的提供者信息,例如,例如,例如。使用电子邮件地址。
这也应该回答您的两个服务器端问题。
客户需要将哪种信息发送到堆栈溢出服务器,以便他们确认这确实是用户?
对于场景的其余部分,应完全颠倒角色。Google摆脱了范围,Stackoverflow将是OAuth2服务器,您的应用程序将是客户端。如果您的应用程序要发布或读取问题,则需要从Stackoverflow用户授权进行此操作。如果授予授权,将返回令牌,您的应用程序应使用令牌访问Stackoverflow上的问题。所以答案是:没有,只有令牌。
要正确完成答案,我必须承认我对上述网站的实现详细信息(Google。Facebook,Stackoverflow等)并不密切熟悉。但是,如果他们符合OAuth2标准,则应如我所描述的那样行事。熟悉的用户,请让我知道是否对任何网站实现了不同的方案!