是否可以在没有javascript的情况下实现Oauth 2.0?

时间:2013-06-06 13:21:38

标签: php javascript oauth oauth-2.0 single-sign-on

在我的电子商务网站上,我向用户提供openid登录信息。 除facebook之外的所有主要提供商都提供了一个openid端点。 Facebook只提供了oauth 2.0。

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

换句话说,我创建了一个中间站点,用户使用Facebook登录,然后使用openid无缝地登录到我的电子商务站点。 这只涉及标题重定向,并且对最终用户透明。

现在亚马逊joined the league单点登录提供商。他们只支持oauth 2.0。

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

所以我想到将oauth直接应用到我的电子商务网站。

然而,实施指示因提供商而异。

大多数都需要在网站中加载外部JavaScript。 为我想支持的每个oauth提供程序加载外部javascripts是我想避免的选项。

Facebook提供完全服务器方面,没有javascripts。

亚马逊没有。

但它的所有oauth 2.0不是吗?

在我看来,标准是非常放松或不一致的。

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

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

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

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

是否可以使用相同的代码库来实现这一点,或者我是否必须使用他们的sdk类和javascripts单独实现它们?

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

那里的oauth 2.0标准在哪里?

任何帮助都是适当的。

个人旁注

  

我很抱歉抓住这个机会简要指出我没有   像Oauth。它要求每个使用它的网站都注册   oauth提供者。这些提供商也可能不同意合作   站点。我不喜欢那种权威,我更喜欢openid。我知道不是   完美,但我更喜欢它。 openid和oauth也很脆弱   设计用于恶意网站允许用户点击的攻击   登录按钮并打开一个欺骗性的提供者端,用户登录   在相信他正在登录提供者网站。它不能   帮助,用户必须查看网址,看看它是否真的   想要的网站。我知道这是一个根本问题而且很难   处理,但我想指出它。

2 个答案:

答案 0 :(得分:3)

提供商之间存在很多相似之处,基本流程也是如此。浏览器中通常不需要任何Javascript。每个提供商给你的东西只是让你更容易的帮助(如果你只关心他们)。

您似乎正在开发一个网站。为此,您需要实现的OAuth 2流称为授权代码流。最重要的是,它只是一些遵循非常类似模式的http(s)请求:

  1. 将用户重定向到提供商
  2. 登录&同意页
  3. 使用code
  4. 重定向回您的网站(注册回调地址)
  5. 您的网站使用来自第3步的access_tokencode / client_id(基本上是您的网络服务器的凭据),向提供商请求client_secret
  6. 使用#4中获得的access_token来调用提供程序API。
  7. 如果你想了解更多细节,我已经写了here。它是在product我正在研究的背景下,但原则是相同的。

    经常变得复杂的地方是:

    • 权限scope,不同于一个提供商。例如:Facebook拥有大量选项,可以非常精细地控制您要求用户披露的内容(例如朋友,照片等)。 LinkedIn的数量较少(例如个人资料,您的网络,通知)。亚马逊只有两个(name,postal_code)。

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

    • 用户个人资料信息。大多数提供程序都有/userprofile端点来检索登录用户的属性。但通常情况下,每个人通常会实现不同的模式:有些使用email其他模式会调用emailaddress。与last_name vs family_name等相同。您可以将配置文件规范化为具有常见语义的内容。

    对于我们的系统,我们选择尽可能将所有内容映射到openid connect userinfo standard claims。并非总是可行,因为提供商通常会提供更多信息。 (Here's我们实际提供的内容)

    关于你的附注:你是对的,使用SSL 总是的充分理由。也是一些提供商正在添加多因素身份验证的原因。

答案 1 :(得分:1)

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

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

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