授权标头在Swift的请求中消失

时间:2020-06-30 05:31:06

标签: swift http-headers jwt jwt-auth

序言

我想通过Swift使用JWT身份验证来调用API。 但是,请从服务器返回HTTP响应代码401。

对不起,我的英语不太好。

源代码

let url = URL(string: HOST + urlString)

var request = URLRequest(url: url!)
request.httpMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
if let key = store.key {
    request.addValue("JWT " + key.token, forHTTPHeaderField: "Authorization")
}

print(request.allHTTPHeaderFields)
// Optional(["Content-Type": "application/json", "Authorization": "JWT {token}"])

let task: URLSessionTask = URLSession.shared.dataTask(with: request) {(data, response, error) in
    // Something code
}

task.resume()

如评论中所述,print(request.allHTTPHeaderFields)的输出为Optional(["Content-Type": "application/json", "Authorization": "JWT {token}"])。 因此,此时可以看出,标题中包含了Atuhorization。

我尝试过的

当我使用相同的令牌通过API Tester(Chrome扩展程序)调用它时,就很好了。

我使用nc命令进行了调试。 添加了以下两行。

request.addValue("application/json", forHTTPHeaderField: "Accept")
request.addValue("fuga", forHTTPHeaderField: "hoge")

结果如下。

$ nc -l 8000
GET {URL} HTTP/1.1
Host: localhost:8000
Content-Type: application/json
hoge: fuga
Accept: application/json
User-Agent: {Client agent name}
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: keep-alive

这样,其他键可以工作,但是只有授权键失败。

补充信息

版本信息。
Xcode:11.5
斯威夫特:5.2.4

1 个答案:

答案 0 :(得分:0)

正如文档JWT documentation中所述,您必须使用“承载”类型的令牌,如下所示:

request.addValue("Bearer \(token)", forHTTPHeaderField: "Authorization")