Rails 3.1 APIで、デバイスの最新バージョンと組み合わせてトークンベースの認証を使用する必要があります。これまでのところ問題はありません。
ここで、クライアント側のPOST/PUTパラメーターに:auth_tokenを追加したくありませんが、このトークンをHTTP_X_MYAPP_AUTH_TOKENのようなリクエストヘッダーとして送信します。
パラメータからのトークンではなく、それを使用することからデバイスを説得できますか? APIユーザーがリクエストヘッダーOR POST/PUTパラメーターを介してトークンを送信できるように、両方を実装することは可能ですか?
よろしく。フェリックス
私は同じニーズを持っていて、この解決策を思いつきました:
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
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
私はこれにカスタムの「戦略」を使用しています: https://Gist.github.com/4492569
Deviseとdevise-token_authenticatableを使用して、httpヘッダーを介してトークンを渡すために、config/initializers /devise.rbでこれを設定する必要がありました。
config.http_authenticatable = true