4

在我的电子商务网站上,我为我的用户提供 openid 登录。除了 facebook,所有主要的供应商都提供了一个 openid 端点。Facebook 仅提供 oauth 2.0。

对于那个例外,我自己设置了一个 openid 端点,用户可以使用 facebooks oauth 登录。

换句话说,我创建了一个中间站点,用户在其中使用 facebook 登录,并从那里使用 openid 无缝登录到我的电子商务站点。这仅涉及标头重定向并且对最终用户透明。

现在亚马逊加入了单点登录提供商联盟。他们只支持 oauth 2.0。

总而言之,oauth 2.0 似乎是获胜的候选人,而不是 openid,因为我关心的所有提供商现在也支持 oauth。

所以我考虑直接在我的电子商务网站中实现 oauth。

然而,实施说明因供应商而异。

大多数需要加载到站点的外部javascript。为我想要支持的每个 oauth 提供者加载外部 JavaScript 是我想避免的一个选项。

Facebook 提供了一个完全服务器端的方式,不涉及 JavaScript。

亚马逊没有。

但是它的所有oauth 2.0不是吗?

在我看来,该标准要么非常宽松,要么没有得到一致实施。

是否可以有一个通用的 oauth 2.0 类,我只需传递特定于提供者的配置和端点并实现登录?

我查看了 Zend 的实现,但它真的很大...... facebook 的 no-javascript 实现真的很小......

我有点迷失在这里。有人可以指出我正确的方向吗?

我想实现几个 oauth 提供程序。其中肯定有谷歌、脸书、亚马逊和推特。

是否可以使用相同的代码库来实现这一点,还是我必须使用它们的 sdk 类和 javascript 分别实现它们?

我可以毫无问题地做到这一点,但我的胆量真的不喜欢它,原因有几个(维护、灵活性、添加新供应商等)

oauth 2.0 标准在哪里?

任何帮助都会得到帮助。

个人旁注

很抱歉借此机会简要指出我不喜欢 Oauth。它要求使用它的每个站点都向 oauth 提供程序注册。此外,这些提供商可能不同意与网站合作。我不喜欢那个权限,我更喜欢openid。我知道它并不完美,但我更喜欢它。此外,openid 和 oauth 在设计上也很容易受到攻击,其中恶意站点允许用户单击登录按钮并打开欺骗的提供方,用户在登录时相信他正在登录提供方站点。没办法,用户必须查看 url 以查看它是否真的是所需的站点。我知道这是一个基本问题并且难以处理,但是我想指出这一点。

4

2 回答 2

4

提供者之间有很多相似之处,基本流程是相同的。浏览器中通常不需要任何 Javascript。每个提供者给你的只是一个帮助你让事情变得更容易(如果你只是关心他们的话)。

看来您正在网站上工作。为此,您需要实现的 OAuth 2 流程称为Authorization Code Flow。归根结底,它只是一些遵循非常相似模式的 http(s) 请求:

  1. 将用户重定向到提供者
  2. 登录和同意页面
  3. 重定向回您的站点(到注册的回调地址)code
  4. 您的网站使用来自第 3 步的步骤和/ (本质上是您的 Web 服务器的凭据)access_token向提供商请求。codeclient_idclient_secret
  5. 使用access_token#4 中获得的调用提供者 API。

如果您想查看更多详细信息,我已经在这里写过。这是在我正在开发的产品的背景下,但原则是相同的。

事情变得有点复杂的地方通常是:

  • 权限scope,从一个提供者到另一个提供者是不同的。例如:Facebook 有很多选项,可以非常精细地控制您要求用户披露的内容(例如朋友、照片等)。LinkedIn 的数量较少(例如个人资料、您的网络、通知)。亚马逊只有两个(名称,邮政编码)。

这些都是非常特定于提供商的,因为它们与他们管理的资源相关联。请注意,OAuth 本质上是一种授权协议(通常用于身份验证)。在许多情况下,如果您不打算调用他们的 API,那么您可以使用最小范围。

  • 用户个人资料信息。大多数提供者都有/userprofile端点来检索登录用户的属性。但很多时候,每个人通常都实现不同的模式:有些人使用email其他人会称之为emailaddress. 与last_namevsfamily_name等相同。您可以将配置文件规范化为具有共同语义的内容。

对于我们的系统,我们选择尽可能将所有内容映射到openid connectuserinfo标准声明。并非总是可能的,因为提供商通常会提供更多信息。(是我们实际提供的)

关于您的旁注:您是对的,始终使用 SSL 的充分理由。这也是一些提供商添加多因素身份验证的原因。

于 2013-06-06T14:51:05.187 回答
1

实际上,您根本不需要 javascript 来实现 OAuth 客户端。OAuth 2.0(或 1.0)是一个标准,因此要连接到任何实施 OAuth 的站点,您需要遵循相同的步骤,可能会有细微的变化。

在 PHP 中,我使用了这个库,虽然我不知道它是否适合 OAuth 2.0,但我使用的是 1.0 和 1.0a:

它应该适合您需要连接的所有服务器。此外,一些关于 OAuth 协议“理论”的阅读可以帮助您: http: //oauth.net/2/

于 2013-06-06T13:29:21.187 回答