2017-07-28 5 views
0

Ich versuche gerade, Objekte für S2AP an Google zu senden. Google empfiehlt JWTs wie this zu unterschreiben:JWT mit google-auth-library-ruby kodieren 0.9+

jwt = { 
    "iss"=> SERVICE_ACCOUNT_EMAIL_ADDRESS, 
    "aud" => "google", 
    "typ" => "savetoandroidpay", 
    "iat"=> Time.now.utc.to_i, 
    "payload" => { 
    "loyaltyObjects" => [], #Loyalty objects 
    "offerObjects" => [], #Offer objects 
    "loyaltyClasses" => [], #Loyalty classes 
    "offerClasses" => [] #Offer classes 
    }, 
    "origins"=> ['http://baconrista.com', 'https://baconrista.com'] 
} 
private_key = Google::APIClient::PKCS12.load_key(SERVICE_ACCOUNT_PRIVATE_KEY, 'notasecret') 
jwtEncoded = JWT.encode(jwt, private_key, "RS256") 

Da jedoch 0.8 nicht mehr der Standard, und Google::APIClient nicht mehr unterstützt wird, kann ich nicht herausfinden, wie mit dem mitgelieferten JSON-Datei dass JWT Anmeldung von einem Compute Maschinendienstkonto.

Ich habe derzeit alles andere eingerichtet, um Zugriffstoken zu generieren, um mit googles API mit OAuth2-Authentifizierung zu sprechen, aber kann nicht für das Leben von mir herauszufinden, wie diese JWTs zu kodieren.

als Referenz, das ist, wie Sie die Zugriffstoken von Google bekommen mit dem Rubin gem

compute = Google::Apis::ComputeV1::ComputeService.new 
File.open(CONFIG[:GOOGLE_APPLICATION_CREDENTIALS], "r") do |json_io| 
    compute.authorization = Google::Auth::DefaultCredentials.make_creds(scope: 'https://www.googleapis.com/auth/wallet_object.issuer', json_key_io: json_io) 
end 
TOKEN = compute.authorization.fetch_access_token! 

Antwort

0

um den Mangel an Fähigkeit zu bekommen jwt der Unterzeichnung des neueren Service verwenden (die nicht vollständig abgeschlossen ist) endete ich die private_key aus dem json keyfile nach oben ziehen sie haben, melden sie es dann etwa so:

def create_signed_JWT(obj, type) 
    JSON.parse(File.open(keyfile.path, 'rb').read) 
    jwt = { 
    iss: credentials['client_email'], 
    aud: "google", 
    typ: "savetoandroidpay", 
    iat: Time.now.utc.to_i, 
    payload: { 
     "#{type}Objects": obj 
    }, 
    origins: [ "https://#{CONFIG[:domain]}", "http://#{CONFIG[:domain]}" ] 
    } 
    JWT.encode(jwt, OpenSSL::PKey::RSA.new(credentials['private_key'], nil), "RS256") 
end 

obj ist das Angebot/Treue Objekt im jSON-Format, ist Typ der Typ des Objekts