OmniAuth单点登录与Devise,invalid_credentials
我有3个网络应用程序 – A,B和C.应用程序A包含用户数据库。 如果访问App B和App C,我希望将用户重定向到App A进行身份validation,然后返回到他们尝试访问的任何应用程序。 同时,他们应该登录到所有应用程序。 除非有人有更好的解决方案,否则我已经使用了本博客文章中描述的OmniAuth / Devise组合解决方案。
我已经分发并更新到Rais 3.1.2示例应用程序A和示例应用程序B / C.
应用A – 提供商 – https://github.com/RobZolkos/sso-devise-omniauth-provider
App B / C – 客户端 – https://github.com/RobZolkos/sso-devise-omniauth-client
这些示例应用程序正常工作,我将被重定向到提供程序应用程序进行身份validation,但它似乎无法进行身份validation。 我在这里附上了日志。 提供商似乎经历了这些动作,但是在日志的第26行,您可以看到似乎存在身份validation问题。
我错过了一些简单的方法来使这些示例应用程序工作吗
我发现了两个问题:
- 由于0.2.1版本omniauth在获取访问权限(POST / oauth / token请求)时已将auth参数名称从
access_token
更改为oauth_token
。 - 由于0.3.0版本omniauth已经改变了在auth请求中传递
oauth_token
方法(GET /auth/josh_id/user.json)。 先前的0.3.0令牌已通过请求参数oauth_token传递,但自0.3.0以来它通过HTTP_AUTHORIZATION头传递。
我不知道如何很好地从头部获取令牌(我认为它可以通过设计获取),所以我丑陋的黑客客户端通过这样的GET参数发送oauth_token(在lib / josh_id.rb中):
def raw_info @raw_info ||= access_token.get("/auth/josh_id/user.json?oauth_token=#{access_token.token}").parsed end
您可以在我们的github存储库中找到完全可行的代码:
我没有在rails中使用oauth的经验,但我将解释我用Java创建自己的提供程序的流程。 在轨道中应用它应该很容易。 如果您将Devise与omniauth一起使用,则需要了解它们如何提供OAuth支持以及哪个版本。
基本
- 消费者登录到应用程序,并获取
consumer_key
和consumer_secret
。 这是通过常规表单完成的,通常在开发人员帐户上。 -
(可选)提供商批准创建的帐户
-
所有OAuth请求都取决于请求中的正确OAuth标头。 正确的标题意味着:
- 所有oauth属性及其值都按字母顺序排序
- 提供了针对特定消费者请求的所有键/令牌。
- 请求使用所有相关机密签名。 提供者和消费者都知道秘密,但不包括在标题中。
- 提供者生成相同的签名。 如果是,则该请求有效。 随机数可用于防止重放攻击。
双腿流量(消费者与提供者)
- 消费者请求资源,提供consumer_key。
- 提供程序根据consumer_key和consumer_secret检查签名
- 授予对资源的访问权限
三足流量(人与消费者对提供者)
- 消费者请求资源提供其consumer_key
- 消费者从提供者处获得未签名的oauth_token和oauth_token_secret
- 用户(提供者上具有用户帐户的人)登录提供者以授权提供oauth_request_token和consumer_key的oauth_token
- 消费者有一个授权的request_token
- Consumer使用request_token请求提供oauth_request_token和consumer_key的access_token
- Provider为特定资源提供access_token和access_token_secret
- 消费者使用access_token来做某事
- 提供商在一定时间后使access_token无效
- 如果过期,消费者再次使用request_token获取新的access_token
oauth的合适资源是官方网站 。 对于3脚的例子,你可以在谷歌oauth游乐场