2013-09-24 58 views
2

我在我的色器件配置以下行以啓用HTTP頭令牌認證:的Rails +設計的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

+0

亞歷山大,你有沒有解決這個問題? –

+0

不幸的是,不,我沒有設法根據文檔獲得使用Devise的HTTP令牌認證。 – Alex

+0

關於subj,請勾選[gist](https://gist.github.com/josevalim/fb706b1e933ef01e4fb6)。對我有幫助。 –

回答

0

Authorization頭的格式是不同的。

Authorization頭應該是這樣的:

# HASHED_TOKEN = Base64.encode64("#{AUTH_TOKEN}:X") 
Authorization: BasiC#{HASHED_TOKEN} 
+1

但這是HTTP基本認證,我正在尋找HTTP令牌認證 – Alex

2

嗯,我想實現和設計出的方式,但並沒有真正爲我工作:/

同時可以使用這在你的ApiController,如果你不希望使用HTTP認證,但仍通過HTTP頭支持令牌身份驗證:

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 
3

我的實現是基於此post一個nd gist

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