我想通过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
答案 0 :(得分:0)
正如文档JWT documentation中所述,您必须使用“承载”类型的令牌,如下所示:
request.addValue("Bearer \(token)", forHTTPHeaderField: "Authorization")