web-dev-qa-db-ja.com

Rails 3 / deviseでPOST / PUTパラメーターからではなくリクエストヘッダーからauth_tokenを使用する

Rails 3.1 APIで、デバイスの最新バージョンと組み合わせてトークンベースの認証を使用する必要があります。これまでのところ問題はありません。

ここで、クライアント側のPOST/PUTパラメーターに:auth_tokenを追加したくありませんが、このトークンをHTTP_X_MYAPP_AUTH_TOKENのようなリクエストヘッダーとして送信します。

パラメータからのトークンではなく、それを使用することからデバイスを説得できますか? APIユーザーがリクエストヘッダーOR POST/PUTパラメーターを介してトークンを送信できるように、両方を実装することは可能ですか?

よろしく。フェリックス

24
GeorgieF

私は同じニーズを持っていて、この解決策を思いつきました:

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
38
Chris Conley

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
4
0x4a6f4672

私はこれにカスタムの「戦略」を使用しています: https://Gist.github.com/4492569

4

Deviseとdevise-token_authenticatableを使用して、httpヘッダーを介してトークンを渡すために、config/initializers /devise.rbでこれを設定する必要がありました。

config.http_authenticatable = true

1
SharonM