【问题标题】:OAuth2 User Mapping and Loosing my CookiesOAuth2 用户映射和丢失我的 Cookie
【发布时间】:2012-08-02 00:15:19
【问题描述】:

围绕 OAuth 将我的老派头包裹起来......

除了请求/响应机制和授权/验证往返(我想我理解)之外,我正在努力将我的 MyUser 对象(可能包含的任何内容)映射到 OAuth 令牌,如果(实际上 ,如果)用户杀死了我可能在浏览器上放置的任何 cookie(加密或其他方式),则不会。

我在原始登录时获得了 MyUser 信息(将其称为我的网站的“注册”),但现在 MyUser 回来了,所有 cookie 都消失了,所以他只是“用户”。很公平,用户必须再次进行 OAuth 登录,但现在我无法将新的 Token / Secret 与 MyUser 数据相关联。

我错过了什么?

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

让我重申一下(我很确定我对此很敏感,但我猜这就是为什么):

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

假设 Hero 使用 Facebook 在我的网站上注册。 FB 返回他的 FB 用户 ID 和名称以及访问令牌。我们足够聪明地请求并获取他的 FB 电子邮件,并在让他进入之前询问他一些其他注册 q。然后我们将其保存在我们的数据存储中(链接到我们自己的用户记录):

OurUserId : 1234
oAuthProviderName : Facebook
oAUthProviderUserId: xxxxx
oAuthProviderUserEmail: hero@mlb.com
oAuthProviderUserName: iBeHero
oAuthToken: entracingly-unique-string-of-goop
oAuthSecret: moredata
.... etc.

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

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

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

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

结果 Twitter 不返回电子邮件地址,所以我无法匹配,即使他们这样做了(我想几乎其他所有人都这样做)英雄 likley 有不止一个电子邮件。

在我看来,我在两次(或多次)登录之间唯一的联系是我设置的任何未删除的 cookie。

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

【问题讨论】:

    标签: cookies oauth-2.0


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复,虽然我明白了原因,但与我的要求不太一样。我将编辑问题以使其更清晰!
    • @Serexx 史蒂夫的回答在您编辑后仍然完全正确。 OAuth 是授权的标准。您有权代表用户访问数据。通过访问识别用户的数据(取决于提供者并且不是 OAuth 标准的一部分),您可以验证他(例如通过请求他的用户 ID)。因此,只需询问用户 ID,检查该 ID 是否已存在于您的数据库中,然后对其做出反应(例如,设置一个新的 cookie)。
    • 当用户在第一次使用 Facebook 后使用 Google 登录(验证自己并授权我)时,我现在有权从 Google 获取数据,但除非我遗漏了一点(很有可能)Google不会给我任何可以让我在我的数据存储中识别基于 Facebook 的原始记录的东西。为了简化,为什么这是不正确的?当您说“询问用户 ID”时,您是在说再次询问 /user/ 吗?
    • @Serexx 假设我注册了 FB。您的应用程序应该存储来自 FB 的用户 ID,以便下次我访问并使用 FB 登录时,您可以正确查找我的帐户。如果我从谷歌、推特等网站上做同样的事情。如果你想将一个帐户链接到多个提供商,你可以将其存储为一个->多个关系。当用户已经登录时,需要在帐户之间建立该链接。例如用户使用 FB 登录,点击“连接我的 Google 帐户”。现在,您的数据库中有一条记录将 FB 和 Google ID 都链接到该用户。
    • 感谢所有 cmets/answers,我将其标记为已回答。我一直在寻找真正不存在的东西,我的头被困在封闭的身份验证体验中,但我想我现在明白如何处理不相关的用户了。感谢您的耐心!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2012-07-21
    • 2016-01-06
    • 1970-01-01
    • 2010-11-05
    相关资源
    最近更新 更多