Ruby Grape API params { requires :token } 无法验证在 headers 中的 token 参数

yashin · 2015年12月14日 · 最后由 ruby_sky 回复于 2015年12月15日 · 2885 次阅读

Grape 项目中,强制要求 token 参数,代码如下。

params {
      requires :token
    }

但如果 token 参数放在 header 中则无法通过验证,报错:Grape::Exceptions::ValidationErrors (token is missing)。

不知道该如何使 requires 能验证到 header 的参数?望各位不吝赐教:)

header 中的参数可以使用 request.headers 取到,但在 params block 里不能直接验证的

#1 楼 @geekontheway 但是如果去掉 params { requires :token } 在接口中可以 params[:token] 直接取到。不太明白为什么 params block 就不能验证到呢?

#2 楼 @yashin params[:token] 取不到的吧,你是放在 header 里面的呀,还是你两个地方都放了 😢

#3 楼 @geekontheway RestClient.get("http://127.0.0.1:9292/api/projects", {params: {page: 1}, token:'ffae4T9STVA5zsZT1tAdL'}) 只放 header 啊

#3 楼 @geekontheway 我错了,是拿不到,是我们代码里有个地方用 env["HTTP_TOKEN"] 拿的。。。

你写个 helper 方法放到 before_filter 里面呢

可以在 before_validation 里判断 https://github.com/ruby-grape/grape#before-and-after

before_validation do
  error! "Token not found in header", 400 if headers["token"].blank?
end
desc 'xxx' do
  headers Token: {
    description: 'user token',
    required: true
  }
end

https://github.com/ruby-grape/grape/blob/master/README.md#describing-methods

#8 楼 @qinix 这个是 description, 不会做 validation.

#10 楼 @rei 如果是 http basic authentication 或者是 oauth2, 可以用 Grape 内置好的。自己写 middleware 有些得不偿失,不如放在 before_validation 里面方便。

authentication 不该是分离开的逻辑吗?

#8 楼 @qinix 是的,headers 描述刚好可以实现,变态就在于我们的 token 要同时支持放在 header 或者 query 中。。。因为友伤着么调用,得兼容。本来增加描述是为了开放 oauth2 方便的,看来只能 oauth2 版本再规范只放一个地方了。

#6 楼 @sharpx #7 楼 @larrylv 原本逻辑是有处理没有 token 的情况,增加 desc 是为了更方便用 swagger 测试和发布接口文档

nginx 要配置允许自定义 header 通过。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号