Rails API:如何将auth token放入headers进行传递?

最近在做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 !

参考

How to send auth token in header to Rails API?

Pass Authenticity token through http header