如何使用OAuth 2.0实现Web小部件

时间:2012-11-04 14:15:36

标签: javascript ajax ruby-on-rails-3 oauth-2.0

我想创建一个Web小部件,它将显示我网站上的信息。

小部件将使用JavaScript包含在客户端的网站HTML中,并且只能用于我的客户端 - 在我的网站上注册的网站。

窗口小部件中的信息应特定于当前访问客户端站点的用户。

因此,我需要对客户端(网站所有者)和资源所有者(网站访问者)进行身份验证。这似乎很好地映射到OAuth 2.0,但我找不到这样一个实现的完整示例或解释。

任何有关此类信息的资源或指示都将受到赞赏。

更新:我偶然发现了this article,其中提供了使用OAuth的方法的大纲。但是,对于我真正了解如何在OAuth 2中使用它还不够详细。

1 个答案:

答案 0 :(得分:8)

有这这样做了许多大型组织,我悲伤地看到没有其他的回答这个问题,因为它是如此重要的Web模式。

我打算假设你没有从头开始自己的OAuth 2.0提供商,如果你做得好 - 否则你应该使用类似Doorkeeper的kickass来为你做这件事。

现在,在OAuth 2.0中,您有以下实体:

  1. 在您网站上注册的用户
  2. 在您的网站上注册的应用程序(订阅您的o​​auth2)
  3. 用户权限,即用户“允许”的应用程序列表
  4. 开发人员(谁正在使用您的身份验证API /小部件并构建应用程序)
  5. 首先要注意的是您必须拥有与每个应用相关联的域名。因此,如果开发人员在您的网站上注册API令牌/机密,则他创建的应用程序将映射到唯一域。

    现在,我认为应用程序通过您的网站验证用户的流程已经很清楚了。话虽这么说,你不需要做太多工作。

    当应用程序将用户发送到您的网站时(为了登录),您可以在用户的​​计算机上放置会话cookie。让我们称之为“Cookie-X”。

    现在,您的网站对用户进行了身份验证,然后返回到应用程序。在那里,我们希望显示一个自定义小部件,其中包含与该用户相关的信息。

    开发人员需要将一些代码粘贴到此应用中。

    流程是这样的:

    1. 该代码将包含您网站的网址及其在您的网站上注册其应用程序时获得的应用程序ID(非秘密)。

    2. 当该代码运行时,它将使用他的appId ping您的网站。您需要使用您的数据库检查该AppID,并另外检查引用URL是否与您的网站中为该AppID注册的域相同。 修改:或者或另外,代码可以检查document.domain并将其包含在您网站的ping中,以便您验证该请求是否来自已注册的域名给定AppID。

    3. 如果这是正确的,你回复一些JS代码。

    4. 您的JS代码会查找您的网站在用户登录时设置的会话Cookie。如果找到该Cookie,则会通过会话回复您的网站,并且您的网站会使用自定义视图内容进行响应。

    5. 编辑正如在评论中正确提到的那样,Cookie应该是HttpOnly以防止常见的XSS攻击。

      附加说明

      这是一种安全方法的原因:

      1. AppId和域名是一个足够好的组合,可以验证其他人是否未获取此信息。即使appId在应用程序html源中可见,任何试图使用别人的AppID的人都必须欺骗域名。

      2. 假设某人接受了不是他的AppID,并在请求您的小部件时编写代码以欺骗引荐来源的域名,他仍然无法看到任何信息。由于您显示的是用户特定信息,因此只有当您的网站可以找到放置在用户浏览器上的会话cookie时才会呈现窗口小部件,而这些会话cookie实际上不会被欺骗。有类似会话劫持的方法等等。但我认为这超出了这个问题的范围。

      3. 其他方法 只要看看Facebook的社交插件,就可以看出还有其他选择。

        例如,可能是使用Iframe。如果您要求开发人员将Iframe添加到他的应用程序中,您甚至可以减少上面提到的一些步骤。但是你必须随身携带JS(在iframe之外)以获取正确的域名等等。从可访问性和界面的角度来看,我找不到iframe。