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