2016-07-19 5 views
0

Dies ist mein erstes Mal mit Curl in meiner Rails 4 App. Ich versuche Plaid mit Stripe zu verwenden. Ich bin in der Lage, den öffentlichen Token für den Stripe-Konto-Token erfolgreich auszutauschen.Parse Curl Informationen in Rails-Anwendung

Stripe with Plaid ACH

Hier ist meine Controller-Aktion.

def create 
     results = `curl https://tartan.plaid.com/exchange_token \ 
     -d client_id="CLIENT_ID" \ 
     -d secret="SECRET_KEY" \ 
     -d public_token="#{params[:public_token]}" \ 
     -d account_id="#{params[:meta][:account_id]}"` 
    end 

Im Terminal mit JSON.parse (Ergebnisse)

{"account_id"=>"ACCOUNT_ID", "stripe_bank_account_token"=>"12345678abcd", "sandbox"=>true, "access_token"=>"test_citi"} 

Wie man die in den Controller stripe_bank_account_token nicht erhalten?

UPDATE

ich den Figaro Gem bin mit den params/Anmeldeinformationen zu verbergen ..

results = 
`curl https://tartan.plaid.com/exchange_token \ 
    -d client_id="#{ ENV['PLAID_CLIENT_ID'] }" \ 
    -d secret="#{ ENV['PLAID_SECRET_KEY'] }" \ 
    -d public_token="#{params[:public_token]}" \ 
    -d account_id="#{params[:meta][:account_id]}"` 

    # here's how I get the stripe_bank_account_token 
    break_down = JSON.parse(results) 
    x = break_down.select { |key, val| key == "stripe_bank_account_token" } 
+0

nur die Bibliothek Rubin karierten verwenden. https://github.com/plaid/plaid-ruby solltest du niemals die Shell aus Ruby-Code aufrufen. –

+0

Der Shell-Aufruf befindet sich auf der Website von Plaid. Ich nahm ihre Anweisungen, als ob Sie den einen oder anderen benutzen könnten? Ist diese Locke von Plaid das Sicherheitsproblem? @MatthewArkin – jgrant

+1

Das Problem ist, dass Sie einen Shell-Befehl von Schienen ausführen, die Benutzereingaben nimmt. Wenn ich Ihr Frontend geändert habe (was jeder Benutzer tun kann, indem er in Chrome mit der rechten Maustaste klickt), kann ich in den Parametern, die möglicherweise einen anderen Befehl ausführen, anstelle von curl einige bösartige Eingaben senden. So könnte ich Public_Token setzen, um Ihren Server zu löschen, alle Ihre Datenbank-Passwörter zu löschen usw. –

Antwort

1

Sie sollten nicht über die Pipeline kräuseln von Ruby-Code zu verwenden, vor allem, wenn es eine Benutzereingabe beinhaltet.

Eher sollten Sie den eingebauten Ruby HTTP Client, ein Juwel wie RestClient oder noch besser das Plaid Ruby Gem verwenden.

gem install plaid

dann nur

require 'Plaid' 
Plaid.config do |p| 
    p.client_id = '<<< Plaid provided client ID >>>' 
    p.secret = '<<< Plaid provided secret key >>>' 
    p.env = :tartan # or :api for production 
end 

user = Plaid::User.exchange_token(params[:public_token], params[:meta][:account_id], product: :auth) 
user.stripe_bank_account_token 
+0

Danke für die Information! Der karierte Rubinstein ist hilfreich. Trotzdem streckte ich mich nach Plaid aus, um über cURL zu reden. Hier ist ihre Antwort "Solange die Anforderungen auf der Clientseite nicht offengelegt werden, was bedeutet, dass die Client-ID und das Geheimnis nicht offengelegt werden, sollten Sie einen Anforderungshandler verwenden und Aufrufe direkt an die API senden." Meine Client-ID und der geheime Schlüssel werden nicht angezeigt ... Ich verwende Figaro und lasse die IDs in meiner application.yml-Datei speichern. – jgrant

+0

Das Problem besteht nicht darin, dass die Client-ID und der geheime Schlüssel dem Client ausgesetzt sind. Ihr Problem besteht darin, dass Sie unsanitierte Client-Eingaben an Ihre Shell übergeben. Als bösartige Entität kann ich die Plaid-Schaltfläche ändern, anstatt Ihnen ein öffentliches Token zu senden, anstatt Ihnen einen Text zu senden, der aus dem curl-Befehl herauskommt und stattdessen etwas böswilliges tut. Alles was sich ergibt = 'curl https://tartan.plaid.com/exchange_token' ist copy und füge das in dein Terminal ein, also wenn ich etwas wie public_token auf "&& rm -rf /" setzen sollte, ein einfacher form post Dein Server würde es sauber wischen. –

+0

Wo soll ich das hinstellen? Geht das in meinen Controller? – jgrant

0

Nur neue Methode erstellen für kariert, smth wie unten.

Auch gute HTTP-Client oder REST-Client

HTTP client

REST client

def create 
    res = plain_curl(params) 
    puts res.inspect #there you will see your respond json obj in rails console. 
end 

private 

def plain_curl(params) 
    #it should return you json object, if not just add return before result. 
    results = `curl https://tartan.plaid.com/exchange_token \ 
    -d client_id="CLIENT_ID" \ 
    -d secret="SECRET_KEY" \ 
    -d public_token="#{params[:public_token]}" \ 
    -d account_id="#{params[:meta][:account_id]}"` 
end 
+0

Ich konnte das mit etwas ähnlich wie das, was Sie haben, laufen. – jgrant

+0

Piping zu Shell, vor allem wenn es um Benutzereingaben geht, ist ein großer Sicherheitsfehler, das ist eine schreckliche Antwort !!!!!!!!! –

+0

@MatthewArkin Wie sonst würde man mit einer API mit etwas Sicherheit mit figaro, .yml-Datei in Schienen verbinden? – jgrant

Verwandte Themen