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
一样。
答案 0 :(得分:0)
找出问题所在。根据{{3}}:
重要
NSURLConnection类和NSURLSession类是 旨在为您处理HTTP协议的各个方面。作为一个 结果,您不应修改以下标题:
授权
连接
主机
WWW验证
所以问题是你不应该修改Authorization标头。在幕后,似乎NSURLRequest在我设置它之后修改了Authorization标头,并将其清空,因此没有交付。不知道为什么它会为Heroku而不是localhost做这个,但是你有它。