Cookies OAuth2用户映射和丢失我的cookie

Cookies OAuth2用户映射和丢失我的cookie,cookies,oauth-2.0,Cookies,Oauth 2.0,把我老式的脑袋绕在OAuth上 除了请求/响应机制和授权/验证往返(我想我在DSTAND下)之外,如果(实际上是在什么时候,而不是如果)用户杀死了我在浏览器上丢弃的任何cookie(加密或其他),我正在努力将我的MyUser对象(可能包含的任何对象)映射到OAuth令牌 我在最初登录时获得了我的用户信息(称之为我的站点的“注册”),但现在我的用户回来了,所有的cookie都不见了,所以他只是“用户”。公平地说,用户必须再次进行OAuth登录,但现在我无法将新的令牌/机密与MyUser数据关联起来

把我老式的脑袋绕在OAuth上

除了请求/响应机制和授权/验证往返(我想我在DSTAND下)之外,如果(实际上是在什么时候,而不是如果)用户杀死了我在浏览器上丢弃的任何cookie(加密或其他),我正在努力将我的MyUser对象(可能包含的任何对象)映射到OAuth令牌

我在最初登录时获得了我的用户信息(称之为我的站点的“注册”),但现在我的用户回来了,所有的cookie都不见了,所以他只是“用户”。公平地说,用户必须再次进行OAuth登录,但现在我无法将新的令牌/机密与MyUser数据关联起来

我错过了什么

---编辑日期:2012年8月2日-----

让我重申一下这一点(我很确定我对这一点很不了解,但我猜这就是为什么):

正如回复中指出的,每个OAuth提供者都有自己的机制。我们可以导航这些,并为用户获取访问令牌

假设英雄使用Facebook在我的网站上注册。FB返回他的FB用户名和名称以及访问令牌。我们很聪明,请求并收到了他的FB电子邮件,在让他进来之前,我们还问了他一些其他的注册问题。然后我们将其保存在数据存储中(链接到我们自己的用户记录):

并设置一个cookie来识别他是我们的用户#1234

现在英雄离开了,出于某种原因杀死了他的饼干,然后回到我们身边

现在他决定用Twitter登录。我没有饼干,所以我不知道他是谁,我们又一次经历了这个过程

在我看来,他就像一个新用户,所以一旦Twitter给我发了一个令牌,我就开始问他注册问题,显然不对

事实证明Twitter没有返回电子邮件地址,所以我无法匹配,即使他们有(我想几乎所有人都有)Hero likley也有不止一封电子邮件

在我看来,这两次(或无论有多少次)登录之间唯一的联系就是我设置的没有被删除的cookies


我们是说整个OAuth2.0机制都依赖于此吗?我不敢相信这是对的,但我看不到其他方法,所以我肯定遗漏了什么,是吗?

如果您也使用OAuth作为登录机制,那么请确保与您交谈的任何提供商都有某种方法返回用户的稳定ID。该ID是用于在数据库中查找用户的密钥


不同的提供商有不同的方法来实现这一点。对于Google,关于如何使用OAuth 2.0进行身份验证的详细信息如下。对于Twitter,它们使用OAuth 1.0,并在将代码交换为访问令牌时返回用户ID。Facebook也有自己的做法

如果您也使用OAuth作为登录机制,那么请确保与您交谈的任何提供商都可以通过某种方式为用户返回稳定的ID。该ID是用于在数据库中查找用户的密钥


不同的提供商有不同的方法来实现这一点。对于Google,关于如何使用OAuth 2.0进行身份验证的详细信息如下。对于Twitter,它们使用OAuth 1.0,并在将代码交换为访问令牌时返回用户ID。Facebook也有自己的做法

谢谢你的回复,虽然我知道原因,但我问的不太清楚。。我将对问题进行编辑,使其更清楚@Serexx编辑后,Steve的答案仍然完全正确。OAuth是授权的标准。您有权代表用户访问数据。通过访问标识用户的数据(取决于提供商,而不是OAuth标准的一部分),您可以对用户进行身份验证(例如,通过请求他的用户ID)。因此,只需询问用户ID,检查该ID是否已经存在于您的数据库中,然后对其作出反应(例如,设置一个新的cookie)。当用户首次使用Facebook后登录谷歌(对自己进行身份验证并授权我)时,我现在有权从谷歌获取数据,但除非我遗漏了一点(很可能)谷歌不会给我任何东西,让我能够识别我数据存储中基于Facebook的原始记录。简单来说,为什么这是不正确的?当你说“询问用户ID”时,你是说再次询问/User/吗?@Serexx假设我注册了FB。您的应用程序应该存储来自FB的用户ID,以便下次我访问FB并登录FB时,您可以正确查找我的帐户。如果我在谷歌、推特等网站上这样做也是一样的。如果你想将一个账户链接到多个提供商,你可以将其存储为一个->多个关系。当用户已经登录时,需要建立帐户之间的链接。例如,用户使用FB登录,单击“连接我的谷歌帐户”。现在,您的数据库中有一条记录将FB和Google ID链接到该用户。感谢所有评论/答案,我将此标记为已回答。我一直在寻找一些真正不存在的东西,我的头被困在封闭的身份验证体验中,但我想我现在明白了如何处理未关联的用户。感谢你的耐心!谢谢你的回复,虽然我知道原因,但我问的不太清楚。。我将对问题进行编辑,使其更清楚@Serexx编辑后,Steve的答案仍然完全正确。OAuth是授权的标准。您有权代表用户访问数据。通过访问标识用户的数据(取决于提供商,而不是OAuth标准的一部分),您可以对用户进行身份验证(例如,通过请求他的用户ID)。因此,只需询问用户ID,检查该ID是否已经存在于您的数据库中,然后对其作出反应(例如,设置一个新的cookie)。当用户首次使用Facebook后登录谷歌(对自己进行身份验证并授权我)时,我现在有权从谷歌获取数据,但除非我遗漏了一点(很可能)谷歌不会给我任何东西,让我能够识别我数据存储中基于Facebook的原始记录。简单来说,为什么这是不正确的
OurUserId : 1234
oAuthProviderName : Facebook
oAUthProviderUserId: xxxxx
oAuthProviderUserEmail: hero@mlb.com
oAuthProviderUserName: iBeHero
oAuthToken: entracingly-unique-string-of-goop
oAuthSecret: moredata
.... etc.