Rails:Microsoft Graph Webhook - 400订阅验证请求超时

时间:2017-08-23 16:32:26

标签: ruby-on-rails microsoft-graph

我在使用MicrosoftGraph Webhook时遇到了一些麻烦。我认为我没有正确返回HTTP响应,因为当我将一个binding.pry放入我的控制器时,在发出请求后它会命中控制器。

但是,在命中我的控制器之前,请求似乎超时(请参阅下面的堆栈跟踪)。这是我的控制器代码和订阅请求代码,以及堆栈跟踪。我非常感谢你的帮助。

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
  

在14613ms完成500内部服务器错误(ActiveRecord:478.4ms)

     

OData :: ClientError(400 InvalidRequest:"订阅验证   请求超时。"从   " https://graph.microsoft.com/v1.0/subscriptions&#34):
  app / models / outlook_wrapper.rb:44:create_subscription'
app/controllers/business/messages_controller.rb:18:in
索引'

     

渲染   /Users/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_source.erb   (7.9ms)呈现   /Users/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb(1.9ms)呈现   /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)呈现   /Users/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb   (176.2ms)

     

开始发帖   " / API /手表/ outlookNotification validationToken = YTJhMTk5MDQtYjdmOC00ZjYxLWIzOGEtMDczM2FjMTAxZTBj&#34?;   for 52.161.110.176 at 2017-08-23 12:29:05 -0400处理方式   InboundEmailsController#outlook_webhook as HTML参数:   {" validationToken" = GT;" YTJhMTk5MDQtYjdmOC00ZjYxLWIzOGEtMDczM2FjMTAxZTBj"}   在35ms内完成200 OK(ActiveRecord:0.0ms)

2 个答案:

答案 0 :(得分:0)

Content-Length为7不足以容纳验证令牌。

就请求超时而言,在本地测试时,notificationUrl是可公开访问的网址吗?如果您使用http://localhost/api/watch/outlookNotification之类的内容,那么Microsoft将不知道如何访问您的webhook,因为localhost不是可公开访问的主机。

即使你确实提供了一个可公开访问的主机,你仍然需要在防火墙上挖洞。我的建议是在本地测试时使用ngrok并使用环境变量来设置主机。

在控制台中运行ngrok http 3000,它会为您提供类似https://d83375e5.ngrok.io的网址。当ngrok正在运行时,它会将d83375e5.ngrok.io上的HTTP和HTTPS请求转发到您的计算机端口3000

如果您使用https://${ENV['WEBHOOK_HOST']}/api/watch/outlookNotification之类的notificationUrl,则在开发中,将环境变量WEBHOOK_HOST设置为ngrok提供的主机。在生产中,您不需要运行ngrok;只需将WEBHOOK_HOST设置为您服务器的可公开访问的主机。

答案 1 :(得分:0)

我参加聚会可能有点晚,但是我遇到了同样的问题。 Rails中的开发环境会阻止多个请求,这就是为什么您超时的原因。由于您正在等待Graph回送请求时的帖子回复,因此该请求将一直被阻止,直到您收到第一篇帖子的回复为止。

您似乎已经发现,在生产环境中运行时这不是问题,因为生产环境设置不会阻止多个请求。