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!