2016-04-18 1 views
1

Ich versuche, SAS-Authentifizierung in einem Ruby-Skript verwenden und ich 401 (Zugriff verweigert) Antwort vom Event-Hub erhalten, scheint es, dass ich das SAS-Token falsch generieren.Generieren Sie eine gültige Authorization Header für azure Service Bus/Eventhubs

Unten finden Sie den Code habe ich verwendet, es basiert auf https://azure.microsoft.com/en-us/documentation/articles/service-bus-sas-overview/ Javascript Beispiel, das ich als Rubin neu geschrieben haben (bitte beachten Sie, es könnte nicht idiomatischen sein)

require "optparse" 
require "CGI" 
require 'openssl' 
require "base64" 
require "Faraday" 
require 'Digest' 

def generateToken(url,keyname,keyvalue) 
    encoded = CGI::escape(url) 
    ttl = (Time.now + 60*5).to_i 
    signature = "#{encoded}\n#{ttl}".encode('utf-8') 
    # puts signature 
    key = Base64.strict_decode64(keyvalue) 
    dig = OpenSSL::HMAC.digest('sha256', key, signature) 
    # dig = Digest::HMAC.digest(signature, key, Digest::SHA256) 
    hash = CGI.escape(Base64.strict_encode64(dig)) 
    # puts hash 
    return "SharedAccessSignature sig=#{hash}&se=#{ttl}&skn=#{keyname}&sr=#{encoded}" 
end 

def build_connection(url,token) 
    conn = Faraday.new(:url => url) do |faraday| 
     faraday.request :url_encoded    # form-encode POST params 
     faraday.response :logger     # log requests to STDOUT 
     faraday.adapter Faraday.default_adapter # make requests with Net::HTTP 
    end 
    conn.headers['Content-Type'] = 'application/json' 
    conn.headers['Authorization'] = token 
    return conn 
end 


if __FILE__ == $0 
    ARGV << '-h' if ARGV.empty? 
    options = {} 
    OptionParser.new do |opts| 
     opts.banner = "Usage: generateSasToken.rb [options]" 
     opts.on('-u URL', '--url URL', 'url for access') { |v| options[:url] = v } 
     opts.on('--keyname NAME','set key name') { |v| options[:keyname] = v } 
     opts.on('--key KEY','set key value') { |v| options[:keyvalue] = v } 
     opts.on_tail("-h", "--help", "Show this message") do 
      puts opts 
      exit 
     end 
    end.parse! 
    token = generateToken(options[:url],options[:keyname],options[:keyvalue]) 
    puts token 
    conn = build_connection(options[:url],token) 
    puts conn.headers 
    response = conn.post do |req| 
        req.body = '{"temprature":50}' 
        req.headers['content-length'] = req.body.length.to_s 
       end 
    puts response 
end 

jede Hilfe zu verstehen, warum das Token falsch ist würde dies

Antwort

0

nach einem Vergleich meines Code gegen den python sdk groß sein, ist der richtige Weg, um das Token zu generieren:

require "optparse" 
require "CGI" 
require 'openssl' 
require "base64" 
require "Faraday" 
require 'Digest' 

def generateToken(url,keyname,keyvalue) 
    encoded = CGI::escape(url) 
    ttl = (Time.now + 60*5).to_i 
    signature = "#{encoded}\n#{ttl}" 
    # puts signature 
    key = keyvalue 
    #dig = OpenSSL::HMAC.digest('sha256', key, signature) 
    dig = Digest::HMAC.digest(signature, key, Digest::SHA256) 
    hash = CGI.escape(Base64.strict_encode64(dig)) 
    # puts hash 
    return "SharedAccessSignature sig=#{hash}&se=#{ttl}&skn=#{keyname}&sr=#{encoded}" 
end 

def build_connection(url,token) 
    conn = Faraday.new(:url => url) do |faraday| 
     faraday.request :url_encoded    # form-encode POST params 
     faraday.response :logger     # log requests to STDOUT 
     faraday.adapter Faraday.default_adapter # make requests with Net::HTTP 
    end 
    conn.headers['Content-Type'] = 'application/json' 
    conn.headers['Authorization'] = token 
    return conn 
end 


if __FILE__ == $0 
    ARGV << '-h' if ARGV.empty? 
    options = {} 
    OptionParser.new do |opts| 
     opts.banner = "Usage: generateSasToken.rb [options]" 
     opts.on('-u URL', '--url URL', 'url for access') { |v| options[:url] = v } 
     opts.on('--keyname NAME','set key name') { |v| options[:keyname] = v } 
     opts.on('--key KEY','set key value') { |v| options[:keyvalue] = v } 
     opts.on_tail("-h", "--help", "Show this message") do 
      puts opts 
      exit 
     end 
    end.parse! 
    token = generateToken(options[:url],options[:keyname],options[:keyvalue]) 
    conn = build_connection(options[:url],token) 
    puts conn.headers 
    response = conn.post do |req| 
        req.body = '{"temprature":50}' 
        req.headers['content-length'] = req.body.length.to_s 
       end 
    puts response 
end 

das war viel einfacher als erwartet keine Notwendigkeit zu utf8 zu kodieren oder den Schlüssel zu dekodieren.

Verwandte Themen