Ruby on rails OmniAuth使用Desive单点登录,凭据无效

Ruby on rails OmniAuth使用Desive单点登录,凭据无效,ruby-on-rails,authentication,ruby-on-rails-3.1,omniauth,oauth-2.0,Ruby On Rails,Authentication,Ruby On Rails 3.1,Omniauth,Oauth 2.0,我有3个web应用程序-A、B和C。应用程序A包含用户数据库。如果访问应用程序B和应用程序C,我希望用户被重定向到应用程序A进行身份验证,然后返回到他们尝试访问的任何应用程序。同时,他们应该登录到所有应用程序。除非有人有更好的解决方案,否则我会选择OmniAuth/Desive组合解决方案,如中所述 我已分叉并更新为Rais 3.1.2示例应用程序a和示例应用程序B/C 应用程序A-提供商- 应用程序B/C-客户端- 这些示例应用程序工作正常,我被重定向到提供商应用程序进行身份验证,但它似乎没有

我有3个web应用程序-A、B和C。应用程序A包含用户数据库。如果访问应用程序B和应用程序C,我希望用户被重定向到应用程序A进行身份验证,然后返回到他们尝试访问的任何应用程序。同时,他们应该登录到所有应用程序。除非有人有更好的解决方案,否则我会选择OmniAuth/Desive组合解决方案,如中所述

我已分叉并更新为Rais 3.1.2示例应用程序a和示例应用程序B/C

应用程序A-提供商-

应用程序B/C-客户端-

这些示例应用程序工作正常,我被重定向到提供商应用程序进行身份验证,但它似乎没有进行身份验证。我已附上日志。提供者似乎经历了一些动作,但在日志的第26行,您可以看到似乎存在身份验证问题


我是否缺少一些简单的方法来让这些示例应用程序正常工作?

我没有使用rails中的oauth的经验,但我将解释我使用Java创建自己的提供者的流程。在rails中应用这一点应该很容易。如果将Desive与omniauth一起使用,则需要了解它们是如何提供OAuth支持的,以及是哪个版本

基础
  • 消费者登录应用程序,并获得
    消费者密钥
    消费者密钥
    。这是通过常规表单完成的,通常是开发人员帐户
  • (可选)提供程序批准创建的帐户

  • 所有OAuth请求都依赖于请求中正确的OAuth头。适当的标题意味着:

  • 所有oauth属性及其值都已按字母顺序排序
  • 提供针对特定消费者请求的所有有效密钥/令牌
  • 使用所有相关机密签署请求。提供者和使用者都知道秘密,但不包括在标题中
  • 提供者生成相同的签名。如果是,则请求有效。nonce可用于防止重播攻击
双腿流(消费者与提供商)
  • 使用者请求资源,提供使用者密钥
  • 提供者根据使用者密钥和使用者密钥检查签名
  • 已授予对资源的访问权限
  • 三股流(个人对消费者对提供者)
  • 消费者请求资源提供其消费者密钥
  • 使用者从提供程序获取未签名的oauth_令牌和oauth_令牌密钥
  • 用户(在提供者上具有用户帐户的人)登录提供者,以授权提供oauth_请求_令牌和消费者_密钥的oauth_令牌
  • 消费者拥有授权的请求\u令牌
  • 使用者使用请求令牌请求访问令牌,提供oauth\u请求令牌和使用者密钥
  • 提供程序为特定资源提供访问令牌和访问令牌密钥
  • 消费者使用access\u令牌执行某些操作
  • 提供程序在特定持续时间后使访问令牌无效
  • 消费者再次使用请求令牌来获取新的访问令牌(如果过期)
  • oauth的一个不错的资源是。
    对于你可以在

    上看到的三条腿的例子,我发现了两个问题:

  • 自0.2.1版以来,omniauth在获取访问权限(POST/oauth/token请求)时已将auth参数名称从
    access\u token
    更改为
    oauth\u token
  • 自0.3.0版以来,omniauth已更改了在auth请求(GET/auth/josh_id/user.json)中传递
    oauth_令牌的方法。先前的0.3.0令牌已通过请求参数oauth_令牌传递,但从0.3.0开始,它将通过HTTP_授权头传递
  • 我不知道如何很好地从头部获取令牌(我认为它可以由Desive获取),因此我对客户端进行了黑客攻击,以便通过get参数发送oauth_令牌,如下所示(在lib/josh_id.rb中):

    def原始信息
    @raw_info | |=access_token.get(“/auth/josh_id/user.json?oauth_token={access_token.token}”)。已解析
    结束
    
    您可以在我们的github repos中找到完全可行的代码:


    提供商get和post似乎工作正常,发布后您是否从提供商处返回令牌和密码?发布后我返回令牌但不返回密码。json呈现行是:render:json=>{:access\u-token=>access\u-grant.access\u-token,:refresh\u-token=>access\u-grant.refresh\u-token,:expires\u-in=>designe.timeout\u-in.to\u-i}我试图做同样的事情,但遇到了同样的问题。用户似乎从未真正登录。如果我尝试将
    warden.session
    输出到日志(在提供者应用程序中),我会得到一个
    warden::NotAuthenticated
    异常。也就是说,
    authenticate\u用户
    before筛选器返回false,这就是它不起作用的原因。我强烈建议您使用此修补程序