2017-09-09 1 views
7

En utilisant https://requestb.in, je peux voir que le webhook envoie correctement l'en-tête + les données de corps json. Mais quand j'envoie la requête json à mon serveur, j'obtiens une erreur d'analyse du fichier json.Parse JSON à partir de la demande de webhook

Mon contrôleur (ne peut pas recevoir les données du corps):

class ReceiverController < ApplicationController 
    skip_before_filter :verify_authenticity_token 

    def handle_post 
     puts request.headers['Content-Type'] 
     puts "request:" 
     puts JSON.parse(request.raw_post) 
     puts "request2:" 
     puts JSON.parse(request.body.read) 
    end 
end 

Erreur de sortie:

application/json; charset=utf-8 
request: 
JSON::ParserError (A JSON text must at least contain two octets!): 
app/controllers/receiver_controller.rb:69:in `handle_post' 
request2: 
Completed 500 Internal Server Error in 7ms (ActiveRecord: 0.0ms) 

routes.rb

post "/receive" => 'receiver#handle_post' 
+0

que le ouptput de 'met request.body.read'? –

+0

@ Зелёный Désolé, c'était la sortie de 'JSON.parse (request.raw_post)'. J'ai ajouté la sortie de 'JSON.parse (request.body.read)' – Taylor

+0

Avez-vous lu mon commentaire? Afficher la sortie de 'puts request.body.read'. –

Répondre

0

Je pense que les blocs de rails recevoir la demande e de CSRF protection que rails offre, je suis un débutant à l'utilisation webhooks de bande mais leur documentation pour webhooks m'a conseillé de faire ce qui suit (https://stripe.com/docs/webhooks):

Si vous utilisez Rails, Django, ou un autre framework Web, votre site peut vérifier automatiquement que chaque requête POST contient un jeton CSRF. Il s'agit d'une fonction de sécurité importante qui aide à vous protéger, vous et vos utilisateurs, contre les tentatives de falsification de requêtes intersites. Cependant, cette mesure de sécurité peut également empêcher votre site de traiter des webhooks légitimes. Si c'est le cas, vous devrez peut-être exempter la route webhooks de la protection CSRF.

class ReceiverController < ApplicationController 
# If your controller accepts requests other than webhooks, 
# you'll probably want to use `protect_from_forgery` to add CSRF 
# protection for your application. But don't forget to exempt 
# your webhook route! 
protect_from_forgery :except => :handle_post 

def handle_post 
    # Process webhook data in `params` 
end 
end 
+0

J'ai le même problème que OP et j'ai cette ligne protect_from_forgery dans mon contrôleur, donc je pense que les solutions doivent être trouvées ailleurs – luissimo

+1

@luissimo Comme vous l'avez mentionné, cela n'a pas résolu le problème.J'utilise à la fois 'protect_from_forgery: except = =: handle_post' et' skip_before_action: verify_authenticity_token,: only => [: handle_post] ' – Taylor