2016-07-28 19 views
0

Ich versuche pure Ruby, active_record, sie und Faraday zu verwenden, um auf eine REST-API zuzugreifen.Faraday TokenAuthentication

Derzeit habe ich zwei Methoden, die ich versucht bin:

▶ cat lib/auth.rb 
class MyTokenAuthentication < Faraday::Middleware 
    def call(env) 
    env[:request_headers]["Authorization: Token"] = RequestStore.store[:my_api_token] 
    @app.call(env) 
    end 
end 

und

▶ cat lib/token.rb 
class TokenAuth < Faraday::Middleware 

def initialize(app, options={}) 
    @app = app 
    @options = options 
end 


def call(env) 
    binding.pry 
    env[:request_headers]["Authorization: Token"] = @options[:token] if @options.include?(:token) 
    env[:request_headers]["Accept"] = "application/json\; version=v1" 
    @app.call(env) 
    end 

end 

auth.rb entspricht Faraday :: Anfrage :: TokenAuthentication

token.rb entspricht # c.use TokenAuth,: Token => "9234bca04b2b9aaceab919770528af13a92447ff"

Ich kommentiere nur aus, wenn es zum Testen benötigt wird.

require_relative './lib/auth' 
require_relative './lib/token' 


db_config  = YAML::load(File.open('config/database.yml')) 
db_config_admin = db_config.merge({'database' => 'superbot', 'schema_search_path' => 'public'}) 
ActiveRecord::Base.establish_connection(db_config_admin[ENV['RAILS_ENV']]) 

RequestStore.store[:my_api_token] = '9234bca04b2b9aaceab919770528af13a92447ff' # or something similar based on `session` 

Her::API.setup url: "http://cool:880/api/" do |c| 
    # Request 
    c.use Faraday::Request::TokenAuthentication, :token => "9234bca04b2b9aaceab919770528af13a92447ff" 
# c.use TokenAuth, :token => "9234bca04b2b9aaceab919770528af13a92447ff" 
    c.use Faraday::Request::UrlEncoded 
    c.use Her::Middleware::AcceptJSON 
    # Response 
    c.use Her::Middleware::DefaultParseJSON 

    # Adapter 
    c.use Faraday::Adapter::NetHttp 
end 

Wenn curl mit und an den Header durch tcpdump suchen erhalte ich:

curl -X GET http://cool:880/api/ -H 'Authorization: token 9234bca04b2b9aaceab919770528af13a92447ff' 

...[...pGET /api/ HTTP/1.1 
Host: cool:880 
User-Agent: curl/7.43.0 
Accept: */* 
Authorization: token 9234bca04b2b9aaceab919770528af13a92447ff 

eigene Middleware:

tcpdump: 
........GET /api/clusters/2/ HTTP/1.1 
User-Agent: Faraday v0.9.2 
Authorization: token: 9234bca04b2b9aaceab919770528af13a92447ff 
Accept: application/json 
Accept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3 
Connection: close 
Host: 134.6.27.164:880 

Pry 
    {"User-Agent"=>"Faraday v0.9.2", 
    "Authorization: Token"=> 
     "9234bca04b2b9aaceab919770528af13a92447ff", 
    "Accept"=>"application/json"} 

{"detail":"Authentication credentials were not provided."} 

Faraday :: Anfrage Mit :: TokenAuthentication

4: def self.header(token, options = nil) 
=> 5: binding.pry 
    6: options ||= {} 
    7: options[:token] = token 
    8: super(:Token, options) 
    9: end 

[1] pry(Faraday::Request::TokenAuthentication)> options ||= {} 
=> {} 
[2] pry(Faraday::Request::TokenAuthentication)> options[:token] = token 
=> {:token=>"9234bca04b2b9aaceab919770528af13a92447ff"} 
[3] pry(Faraday::Request::TokenAuthentication)> super(:Token, options) 
=> "Token token=\"{:token=>\\\"9234bca04b2b9aaceab919770528af13a92447ff\\\"}\"" 

User-Agent: Faraday v0.9.2 
Authorization: Token token="{:token=>\"9234bca04b2b9aaceab919770528af13a92447ff\"}" 
Accept: application/json 
Accept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3 
Connection: close 
Host: cool:880 

{"detail":"Invalid token."} 

Ich bin ziemlich verwirren ...

Es scheint Faraday :: Anfrage :: TokenAuthentication korrekt formatiert ist aber concating es falsch ..

Meine Middleware scheint, wie es funktioniert, aber es ist das Hinzufügen eines Doppelpunkt ‚:‘ nach token:

Authorization: token: 9234bca04b2b9aaceab919770528af13a92447ff 

sollte sein:

Authorization: token 9234bca04b2b9aaceab919770528af13a92447ff 

dankt Ihnen!

Antwort

0

hatte die völlig falsche Klasse sein sollte:

C.Verwendung Faraday :: Anfrage :: Authorization 'Token', "9234bca04b2b9aaceab919770528af13a92447ff"