最近在做Rails API,遇到一个问题。
背景
加入用户登录验证后,每次新建一个project时,发出post请求,都要将auth_token放在body中进行传递,如果是get,则将auth_token作为参数放在URL的后面,因为get是没有body的。
这么做有什么不好呢?
这导致URL特别长,看着很不清爽,每次用postman发出get请求,都觉得这种做法真的是太太小白了,想着要把auth_token放在headers中才好。
Google了下,问题解决,附上解决方法。
正文
以project为例,在postman中,你的请求如下:

这时,如果你将auth_token放在headers中进行传递,发出get请求后,会出现error,如下:

怎么破?
原先对于user 的auth_token的传递,在api_controller.rb中的定义如下:
class ApiController < ActionController::Base
  before_action :authenticate_user_from_token!
  def authenticate_user_from_token!
    if params[:auth_token].present?
      user = User.find_by_authentication_token(params[:auth_token])
      sign_in(user, store: false) if user
    end
  end
  ......
end
这里,可以看到接收的是params[:auth_token], 我们稍稍修改下,用request.headers['auth_token']来代替params[:auth_token]:
class ApiController < ActionController::Base
  before_action :authenticate_user_from_token!
  def authenticate_user_from_token!
    if request.headers['auth_token']
      user = User.find_by_authentication_token(request.headers['auth_token'])
      sign_in(user, store: false) if user
    end
  end
  ......
end
这时,再看看postman, OK !
