2017-08-23 1 views
0

Ich habe einige Probleme mit der MicrosoftGraph Webhook. Ich denke, dass ich HTTP-Antwort nicht richtig zurückgebe, weil, wenn ich eine binding.pry in meinen Controller setze, nach der Anfrage den Controller trifft.Rails: Microsoft Graph Webhook - 400 Abonnement Validierung Zeitüberschreitung

Die Anfrage scheint jedoch Timeout zu sein, bevor sie meinen Controller trifft (siehe Stack-Trace unten). Hier ist mein Controllercode und Abonnementanforderungscode und Stack-Trace. Ich schätze die Hilfe sehr. ("Timed Abonnement Validierung Anfrage aus." Von "https://graph.microsoft.com/v1.0/subscriptions" 400 INVALIDREQUEST):

def self.create_subscription(user) 

    callback = Proc.new do |r| 
    r.headers['Authorization'] = "Bearer #{user.outlook_token.access_token}" 
    r.headers['Content-Type'] = 'application/json' 
    r.headers['X-AnchorMailbox'] = user.email 
    end 

    path = 'subscriptions' 

    data = { 
    changeType: "created, updated", 
    notificationUrl: "https://my_url/api/watch/outlookNotification", 
    resource: "me/mailFolders('Inbox')/messages", 
    expirationDateTime:"2017-08-19T06:23:45.9356913Z", 
    clientState: "subscription-identifier" 
    } 

    graph = MicrosoftGraph.new(base_url: 'https://graph.microsoft.com/v1.0', 
          cached_metadata_file: File.join(MicrosoftGraph::CACHED_METADATA_DIRECTORY, 'metadata_v1.0.xml'), 
          &callback) 

    response = graph.service.post(path, data.to_json) 
end 

def outlook_webhook 
    @token = params[:validationToken] 
    head 200, content_type: "text/plain", content_length: 7 
    response.body = @token 
end 

Completed 500 Internal Server Error in 14613ms (Active 478.4ms)

OData :: ClientError:
app/Modelle/outlook_wrapper.rb: 44: in create_subscription'
app/controllers/business/messages_controller.rb:18:in
Index‘

/Users/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gem Tragenes s/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rettet/_source.erb (7.9ms) gerendert /Users/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/ Gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rettet/_trace.text.erb (1.9ms) Gerendert /Users/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0 /gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb (3.8ms) Gerendert /Users/.rbenv/versions/2.1.2/lib/ruby/gems/2.1 0,0/Edelsteine ​​/ Action-4.2.4/lib/action_dispatch/Middleware/templates/Rettungen/diagnostics.text.erb (176.2ms)

POST gestartet „/ api/watch/outlookNotification? validationToken = YTJhMTk5MDQtYjdmOC00ZjYx LWIzOGEtMDczM2FjMTAxZTBj“ für 52.161.110.176 bei 2017.08.23 00.29.05 -0400 Verarbeitung von InboundEmailsController # outlook_webhook als HTML-Parameter: { "validationToken"=> "YTJhMTk5MDQtYjdmOC00ZjYxLWIzOGEtMDczM2FjMTAxZTBj"} 200 OK in 35ms (Active Abgeschlossen: 0.0.0.0)

Antwort

0

Eine Inhaltslänge von 7 ist nicht groß genug, um das Validierungstoken aufzunehmen.

Soweit die Anforderung beim lokalen Testen fehlschlägt, ist notificationUrl eine öffentlich zugängliche URL? Wenn Sie etwas wie http://localhost/api/watch/outlookNotification verwenden, wird Microsoft nicht wissen, wie Sie auf Ihren Webhook zugreifen können, da localhost kein öffentlich zugänglicher Host ist.

Auch wenn Sie einen öffentlich zugänglichen Host bereitstellen, müssen Sie dennoch ein Loch in Ihre Firewall stecken. Mein Vorschlag ist, ngrok beim lokalen Testen zu verwenden und eine Umgebungsvariable zu verwenden, um den Host festzulegen.

Führen Sie ngrok http 3000 in einer Konsole und es wird Ihnen eine URL geben, die etwa wie https://d83375e5.ngrok.io aussieht. Während ngrok ausgeführt wird, leitet es HTTP- und HTTPS-Anforderungen von d83375e5.ngrok.io über Port 3000 an Ihren Computer weiter.

Wenn Sie eine notificationUrl wie https://${ENV['WEBHOOK_HOST']}/api/watch/outlookNotification verwenden, legen Sie in der Entwicklung die Umgebungsvariable WEBHOOK_HOST auf den Host fest, der von ngrok bereitgestellt wird.In der Produktion müssen Sie ngrok nicht ausführen; Setzen Sie einfach WEBHOOK_HOST auf den öffentlich zugänglichen Host für Ihren Server.

+0

Jordan, danke für die Antwort, das habe ich seitdem geändert. Ich habe die Lösung in der Produktion arbeiten. Mein Timeout-Server läuft jedoch immer noch ab, bevor eine Antwort zurückgegeben wird. Hast du irgendwelche Ideen, warum mein Localhost nicht schnell genug antworten würde? –

+0

Ich habe meine Antwort aktualisiert, um die Zeitüberschreitung zu beheben. – jordanbtucker

+0

Hallo Jordan, sorry ich hätte angeben sollen, dass ich mit Ngrok meine Anwendung bereits tunnell benutze. Ich entschuldige mich. Ich verstehe wirklich nicht, warum es nicht funktioniert. Ich habe sogar meinen Widder aktualisiert, meinen Rechner aufgeräumt, um die Leistung zu verbessern, also weiß ich wirklich nicht ... –

Verwandte Themen