2

HTTPヘッダーでトークン認証を有効にするために、デバイス構成に次の行があります。

config.http_authenticatable = [:token]

ただし、リソースにアクセスしようとすると、次のコマンドを実行すると 401 が返されます。

curl -v -H "Accept: application/json" -H "Content-type: application/json" -H "Authorization: Token token=\"c9G52z6n6LpGt5Ls6omW\"" http://localhost:3000/api/v1/objects/

トークンが正しいことの証明として、次のように動作します。

curl -v -H "Accept: application/json" -H "Content-type: application/json" http://localhost:3000/api/v1/objects?auth_token=c9G52z6n6LpGt5Ls6omW

HTTPヘッダーでトークン認証を機能させることができた人はいますか? 私はそれ以外に多くの情報を見つけることができません:

http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Token.html https://groups.google.com/forum/#!topic/plataformatec-devise/o3Gqgl0yUZo

4

3 に答える 3

3

私の実装は、この投稿とこの要点に基づいています。

user.rb

class User < ActiveRecord::Base

  devise :database_authenticatable, 
         :recoverable, :rememberable, :trackable, :validatable

  before_create :set_auth_token

  private

    def set_auth_token
      return if auth_token.present?

      begin
        self.auth_token = SecureRandom.hex
      end while self.class.exists?(auth_token: self.auth_token)
    end

end

api_controller.rb

class ApiController < ApplicationController

  before_action :authenticate

  protected

    def authenticate
      authenticate_token || render_unauthorized
    end

    def authenticate_token
      authenticate_with_http_token do |token, options|
        user = User.find_by(auth_token: token)

        if user
          sign_in user, store: false
        end

        user
      end
    end

    def render_unauthorized
      self.headers['WWW-Authenticate'] = 'Token realm="Application"'
      render json: 'Bad credentials', status: 401
    end

end
于 2014-08-12T08:53:02.783 に答える
2

まあ、私はdeviseでそのようにそれを有効にしようとしましたが、それは私にとってはうまくいきませんでした:/

一方、http 認証を使用したくないが、http ヘッダーによるトークン認証をサポートする場合は、ApiController でこれを使用できます。

before_filter :authenticate_with_http_token
def authenticate_with_http_token
  auth_header = request.headers['Authorization'].to_s
  token = auth_header[/token="(.*?)"/,1]
  return unless token

  user = User.find_for_token_authentication(auth_token: token)
  sign_in user if user
end
于 2013-09-27T10:30:10.193 に答える