authenticate_or_request_with_http_token始终使用AFNetworking返回false

时间:2015-08-30 18:49:25

标签: ios ruby-on-rails heroku afnetworking

before_filter :restrict_access

def restrict_access
  authenticate_or_request_with_http_token do |token, options|
    true
  end
end

在这里你可以看到我总是为authenticate_or_request_with_http_token返回true,就像试图强制它一样。但是,我遇到了一个非常奇怪的问题。

我在Authorization标头中发送了值Token token=token value here

此处的客户端是使用AFNetworking的iOS应用程序。

当iOS应用程序在localhost:3000上调用它时,它按预期工作,并且我没有收到401错误。

但是,使用完全相同的代码,当我在远程服务器(Heroku)上运行时,我得到一个401.

但是,当客户端是iOS应用程序时,401仅在远程服务器上发生。通过Paw或Postman运行时,它可以正常工作。它令人难以置信。

这是设置授权标头的iOS代码: [self.operationManager.requestSerializer setValue:[NSString stringWithFormat:@"Token token=%@", accessToken] forHTTPHeaderField:@"Authorization"];

为什么要从iOS模拟器运行请求 - > localhost工作得很好,但是从iOS模拟器运行相同的请求 - > Heroku不起作用并导致401?

请记住,authenticate_or_request_with_http_token总是回归真实。所以在我看来,Heroku可能正在修改Authorization标头格式,因此它变为无效格式,并且永远不会调用该块。如果授权标头格式搞砸了,authenticate_or_request_with_http_token似乎默认返回false,就像我传入token=432而不是Token token=432一样。

1 个答案:

答案 0 :(得分:0)

找出问题所在。根据{{​​3}}:

  

重要

     

NSURLConnection类和NSURLSession类是   旨在为您处理HTTP协议的各个方面。作为一个   结果,您不应修改以下标题:

     

授权

     

连接

     

主机

     

WWW验证

所以问题是你不应该修改Authorization标头。在幕后,似乎NSURLRequest在我设置它之后修改了Authorization标头,并将其清空,因此没有交付。不知道为什么它会为Heroku而不是localhost做这个,但是你有它。