0

将我的老式头脑包裹在 OAuth 周围......

除了请求/响应机制和 Authorize / Authenticate 往返行程(我想我理解)之外,我还在努力将我的 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 没有返回电子邮件地址,所以我无法匹配,即使他们这样做了(我想几乎其他所有人都这样做了)Hero likley 有不止一个电子邮件。

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

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

4

1 回答 1

3

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

Different providers have different ways of doing this. For Google, details on how to do authentication with OAuth 2.0 are here. For Twitter, they use OAuth 1.0 and return the user ID when exchanging the code for an access token. Facebook has its own way of doing it as well.

于 2012-08-02T17:39:32.500 回答