4

我想仅将一个典型的 rails 3.2 mvc 应用程序重建为 API + 前端(主干)。因为我没有在rails中构建API的经验,包括authenticatin:

  • 使用主干对设计进行身份验证的最佳方法是什么?使用 auth_tokens?
  • 我应该如何制作他的 API?只是打印出 JSON 或使用像 Grape 这样的宝石?

提前致谢!

4

1 回答 1

10

我可以向您解释我这样做的方式:

首先,我使用 devise 安装了一个标准的 rails 应用程序。之后,我创建了自己的会话控制器:

class SessionsController < ApplicationController

  def authenticate
    # this method logs you in and returns you a single_access_token token for authentication.
    @user = User.find_for_authentication(:email => params[:user][:email])

    if @user && @user.valid_password?(params[:user][:password])
      render :json => {:user => {:email => @user.email, :id => @user.id, :firsname => @user.firstname, :lastname => @user.lastname, :team_id => @user.team_id, :singleAccessToken => @user.generate_access_token}}
    else
      render :json => {:errors => ["Nom d'utilisateur ou mot de passe invalide"]}, :status => 401
    end
  end
end

如您所见,我向这个 url 发送了一个请求,json 看起来像:

{ 
   user => {
      email => "myemail@toto.com",
      password => "monpass"
   }
} 

如果一切正常或出错,我的控制器会返回带有用户数据的 json。在带有用户的 json 上,我返回用于下一个请求的 access_token 以检查是否允许用户请求。我在我的应用程序控制器中制作了这个过滤器:

class ApplicationController < ActionController::Base
  protect_from_forgery

  protected
  def user_access_token
    request.headers["HTTP_X_USER_ACCESS_TOKEN"] || request.headers["HTTP_USER_ACCESS_TOKEN"]
  end

  def current_user
    if token = user_access_token
      @user ||= User.find_by_access_token(token)
    end
  end

  def require_user
    unless current_user
      render :json => {:error => "Invalid Access Token"}, :status => 401
    end
  end

  def require_owner
    unless current_user && current_user == object.user
      render :json => {:error => "Unauthorized"}
    end
  end

end

如您所见,在每个下一个请求中,我将在 html 标头中添加 access_token 键:HTTP_USER_ACCESS_TOKEN

所以,我可以检查是否允许用户提出请求。

要制作 API,您可以使用 Rails API gem,如下所示:

http://railscasts.com/episodes/348-the-rails-api-gem

祝你好运。

于 2012-06-05T08:29:05.700 回答