EmberJS,Rail和第三方OAuth2登录

时间:2014-02-28 10:20:17

标签: ruby-on-rails ember.js oauth-2.0 google-oauth

现在我正在寻找两天以上的解决方案来解决以下问题。我有一个EmberJS客户端javascript应用程序,它使用我的服务器端Rail RESTful API。授权通过访问令牌完成。

现在,我想让用户也可以使用来自Google,Twitter等的OAuth2登录。 Discourse使用OmniAuth进行第三方登录,但OmniAuth需要服务器端会话。因为我构建了RESTful和无状态API,所以我不想在服务器上使用会话。所以我决定在Google+ Sign-In for server-side apps的帮助下自己构建它,但那里的例子也使用了一个会话。

有没有人有类似问题的解决方案或解决我问题的一些提示?

编辑1

由于OmniAuth不适合我的设置,我开始在Googles help之后为第三方OAuth2登录创建自己的实现。一切都运转良好。但是我没有实施上面提到的谷歌网站上标题1. Create an anti-forgery state token下解释的CSRF保护。我的问题是,如何在不使用会话的情况下存储此CSRF令牌。是否足以将其存储在数据库中并在以后的谷歌回调请求中查找?

编辑2

我遵循了railscast。如果用户想要使用extern oauth提供程序登录,则有三种可能的情况:

  1. 用户已经注册了extern oauth,然后他获得了一个门卫访问令牌。
  2. 用户拥有一个帐户,但之前未与extern提供商登录。在oauth流之后,我们只需要为该用户创建一个新的身份验证。
  3. 用户没有帐户,现在尝试使用extern提供程序登录。在这里,我们必须将用户重定向到注册页面,我们也可以使用来自oauth提供商的信息来预先填写注册表单,但在用户按下注册按钮之前,我们必须保存认证
  4. 我现在的问题是,在REST API中保存此类信息(authentication,oauth2 csrf-token)服务器端的好方法是什么,而不使用会话。我必须在服务器上保存这些信息,因为用户不应该在客户端操作它们。

    也许我也应该为Ember应用程序和两者的可能解决方案创建一个关于令牌和会话身份验证的优缺点的新问题?

    这是我的身份验证控制器:

    class Api::V1::AuthenticationsController < ApplicationController
      def oauth
        # redirect to google/twitter/...
        login_at(params[:provider])
      end
    
      def callback
        # callback from provider
        provider = params[:provider]
        if @user = login_from(provider)
          doorkeepter_token = Doorkeeper::AccessToken.create!(:resource_owner_id => @user.id)
          @data = {
            access_token: doorkeepter_token.token,
            user: @user
          }
          render 'oauth/complete'
        else
          # user has no account, create a new one
          @user = User.new
          @user.email = @user_hash[:user_info]['email']
          @user.authentications.build(:uid => @user_hash[:uid], :provider => params[:provider])
          @user.oauth_pending!
          if @user.save
            doorkeepter_token = Doorkeeper::AccessToken.create!(:resource_owner_id => @user.id)
    
            @data = {
              access_token: doorkeepter_token.token,
              user: @user,
              errors: @user.errors
            }
            render 'oauth/complete'
          else
            render 'oauth/error'
          end
        end
      end
    end
    

3 个答案:

答案 0 :(得分:1)

Ember.SimpleAuth仓库中有一个示例,展示了如何将Facebook用作外部身份验证提供程序:https://github.com/simplabs/ember-simple-auth/blob/master/examples/7-external-oauth/index.html。它基本上就像Discourse一样,或者是在2-3个月前做的(不确定是否改变它),而不需要服务器端会话。

支持Google的工作方式基本相同。

答案 1 :(得分:1)

我更新了Facebook Auth示例,以便服务器部分是可选的 - 它现在使用Facebook JS SDK:https://github.com/simplabs/ember-simple-auth/blob/master/examples/7-facebook-auth.html。也许这有助于您了解如何实施Google Auth - 我相信它的工作方式非常相似。

答案 2 :(得分:0)

你见过ember-simple-auth项目吗?它支持OAuth2。