2012-08-02 63 views
0

结束语我老式的头周围的OAuth ....的OAuth2用户映射和失去我的饼干

从请求/响应机制和授权/身份验证往返(我想我underdstand)我奋力

除了如果(实际上,而不是如果)用户杀死我可能在浏览器上丢弃的任何cookie(加密的或其他的),则将MyUser对象(可能包含的任何内容)映射到OAuth令牌。

我在原始登录中获取MyUser信息(称为“注册”为我的网站),但现在MyUser回来了,所有的cookies都消失了,所以他只是'用户'。足够公平,用户必须再次进行OAuth登录,但现在我无法将新令牌/秘密与MyUser数据相关联。

我错过了什么?

---编辑八月2/2012 -----

让我重申这一点(我敢肯定我是厚约这一点,但我猜这是在这里什么):

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

可以说英雄在我的网站上使用Facebook注册。 FB返回他的FB UserID和Name以及Access Token。我们是足够聪明的请求,并得到他的FB电子邮件,我们问他一些其他注册q的值让他在那之前,我们把它保存在我们的数据存储(链接到我们自己的用户记录):

OurUserId : 1234 
oAuthProviderName : Facebook 
oAUthProviderUserId: xxxxx 
oAuthProviderUserEmail: [email protected] 
oAuthProviderUserName: iBeHero 
oAuthToken: entracingly-unique-string-of-goop 
oAuthSecret: moredata 
.... etc. 

,并设置一个饼干,以识别他为我们的用户#1234.

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

现在他决定用Twitter登录。我没有cookie,所以我不知道他是谁,然后我们再次完成这个过程。

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

原来,Twitter并没有返回电子邮件地址,所以我无法与之相匹配,即使他们这样做(我认为几乎所有人都这样)英雄似乎有多个电子邮件。

在我看来,我在两个(或多个)登录之间唯一的联系是我设置的没有被删除的cookie。

我们是说整个OAuth2.0机制都挂在这个上面吗?我无法相信那是对的,但是看不到另一种方式,所以我必须错过某些东西,是的?

回答

3

如果您也使用OAuth作为登录机制,请确保与您交谈的提供商有某种方式可以为用户返回稳定的ID。该ID是您用于在数据库中查找用户的关键。

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

+0

感谢您的回复,不完全是我所问,虽然我可以看到为什么..我要编辑的问题更清楚! – Serexx 2012-08-02 20:04:19

+1

@Serexx在编辑完成后,Steve的回答仍然完全正确。 OAuth是* Authorization *的标准。您有权代表用户访问数据。通过访问标识用户的数据(取决于提供商,而不是OAuth标准的一部分),您可以*认证他(例如通过请求他的用户ID)。因此,只需询问用户ID,检查ID是否已存在于您的数据库中,然后对其作出反应(例如,设置新的cookie)。 – 2012-08-02 20:50:24

+0

当用户第一次使用Facebook登录(认证自己并授权我)时,我现在被授权从Google获取数据,但除非我错过了一点(很可能),Google不会给我任何可以让我在我的数据存储中识别原始的基于Facebook的记录的东西。为了简化,为什么这是不正确的?当你说'请求用户名'时,你是说再次询问/ user /? – Serexx 2012-08-03 05:21:29