在 Rails 3 / devise 中使用请求标头中的 auth_token 而不是 POST/PUT 参数

发布于 2024-12-04 10:37:12 字数 237 浏览 1 评论 0原文

我需要在 Rails 3.1 API 中与最新版本的设计结合使用基于令牌的身份验证。到目前为止没有问题。

现在我不想将我的 :auth_token 附加到客户端的 POST/PUT 参数,而是将此令牌作为请求标头发送,如 HTTP_X_MYAPP_AUTH_TOKEN"。

我可以说服设计使用它而不是参数中的令牌吗?是否可以实现 ,以便我的 API 用户可以通过请求标头或 POST/PUT 参数发送令牌?

两者

I need to use token based authentication in a Rails 3.1 API in conjunction with the most recent version of devise. No problem so far.

Now I do not want to append my :auth_token to the POST/PUT parameters on client side but send this token as a request header like HTTP_X_MYAPP_AUTH_TOKEN".

Can I convince devise from using that rather than a token from parameters? Is it possible to implement both, so that my API users can send the token via request header OR POST/PUT parameter?

Regards. Felix

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

贵在坚持 2024-12-11 10:37:12

我有同样的需求并提出了这个解决方案:

class YourController < ApplicationController
  prepend_before_filter :get_api_key
  before_filter :authenticate_user!

  private
  def get_api_key
    if api_key = params[:api_key].blank? && request.headers["X-API-KEY"]
      params[:api_key] = api_key
    end
  end
end

请注意,我将我的设备 Devise.token_authentication_key 设置为 api_key

config.token_authentication_key = :api_key

I had the same need and came up with this solution:

class YourController < ApplicationController
  prepend_before_filter :get_api_key
  before_filter :authenticate_user!

  private
  def get_api_key
    if api_key = params[:api_key].blank? && request.headers["X-API-KEY"]
      params[:api_key] = api_key
    end
  end
end

Note I have my devise Devise.token_authentication_key set to api_key.

config.token_authentication_key = :api_key
何以畏孤独 2024-12-11 10:37:12

我为此使用自定义“策略”: https://gist.github.com/4492569

I'm using a custom "strategy" for this: https://gist.github.com/4492569

娇纵 2024-12-11 10:37:12

在 Devise 中,可以通过查询字符串或 HTTP 基本身份验证的标头传递标准身份验证令牌,请参阅 此处。规范中用于在 HTTP_Authorization 标头中传递令牌的 Ruby 代码是

header = "Basic #{Base64.encode64("#{VALID_AUTHENTICATION_TOKEN}:X")}"
get users_path(:format => :xml), {}, "HTTP_AUTHORIZATION" => header

使用curl 从命令行进行测试,如下所示:

echo  "HUGP59gXsd7773a75Dvc:X" | base64
=> SFVHUDU5Z1hzZDc3NzNhNzVEdmM6WAo=
curl --header "Authorization: Basic SFVHUDU5Z1hzZDc3NzNhNzVEdmM6WAo=" \ 
     http://localhost/users.xml

It is possible in Devise to pass a standard authentication token through query string or the header for HTTP Basic Authentication, see here. The Ruby code from the specs to pass token in the HTTP_Authorization header is

header = "Basic #{Base64.encode64("#{VALID_AUTHENTICATION_TOKEN}:X")}"
get users_path(:format => :xml), {}, "HTTP_AUTHORIZATION" => header

Testing from the command line with curl would go like this:

echo  "HUGP59gXsd7773a75Dvc:X" | base64
=> SFVHUDU5Z1hzZDc3NzNhNzVEdmM6WAo=
curl --header "Authorization: Basic SFVHUDU5Z1hzZDc3NzNhNzVEdmM6WAo=" \ 
     http://localhost/users.xml
泪之魂 2024-12-11 10:37:12

使用 devise 和 devise-token_authenticatable,我必须在 config/initializers/devise.rb 中进行设置,以便通过 http 标头传递令牌:

config.http_authenticatable = true

Using devise and devise-token_authenticatable, I had to set this in my config/initializers/devise.rb in order to pass the token via http headers:

config.http_authenticatable = true

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文