无法解码令牌:令牌###

Posted

技术标签:

【中文标题】无法解码令牌:令牌###【英文标题】:Could not decode token: The token ### 【发布时间】:2017-04-15 07:50:37 【问题描述】:

我使用 Laravel 5.3 作为我的 ios 应用程序的 API。当我尝试使用标头和参数进行 HTTP 调用时,出现 401 错误:

message = "无法解码令牌:令牌 \ “可选(\” “eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjUsImlzcyI6Imh0dHA6XC9cL2xvY2FsaG9zdDo4MDAwXC9hcGlcL2F1dGhcL3Bvc3RMb2dpbiIsImlhdCI6MTQ4MDUzNzQxOCwiZXhwIjoxNDgwNTQxMDE4LCJuYmYiOjE0ODA1Mzc0MTgsImp0aSI6ImMyZmYxNzI5N2U5OGU4MzkzYzZkZWRmNTZlN2ZkMzNkIn0.u6sQqlq5k-B5jhZ7EymkXLlcTIQ-i7X_83an5irwTss \””是一个 无效的 JWS"; “状态码”= 401;

这是发出 HTTP 请求的代码:

let headers = ["Authorization":"Bearer \(token)"]

    request(url! ,  method: .get, parameters: nil, encoding: JSONEncoding.default ,  headers: headers )
        .responseJSON  response in


        print("RESPONSE \(response)")

我做了一些谷歌搜索,发现了一个名为 JWTDecode.swift 的用于编码 JWT 的包。这是代码的链接:https://github.com/auth0/JWTDecode.swift。我仍然无法弄清楚如何解决这个问题。

【问题讨论】:

在错误消息中,token 是 Optional 并且没有被解包,这可能是原因。 我将令牌保存在这样的容器中 `var token: String? didSet let defaults = UserDefaults.standard defaults.set(token, forKey:DefaultsKey.token) ` 然后在标头数组中调用它 let headers = ["Authorization" : "Bearer\(UserDataSingleton.sharedDataContainer.token)"]n 我应该在哪里解包? 用户 simpleBob 的答案似乎正确。 【参考方案1】:

改变

let headers = ["Authorization":"Bearer \(token)"]

类似

guard let token = token else  return 
let headers = ["Authorization":"Bearer \(token)"]

否则,您将发送 Optional(<token>) 而不是 <token>

【讨论】:

你的意思是这样guard let token = UserDataSingleton.sharedDataContainer.token else return nil let headers = ["Authorization":"Bearer \(token)"],因为令牌保存在nsuserdefaults中 没错,如果你在一个没有令牌的情况下应该返回nil的函数。 错误unexpected non void return value in void function 更新了答案,你不应该返回nil,你应该返回 你可能用一个可选项保存它,你也必须打开它(添加一个if letguard let!

以上是关于无法解码令牌:令牌###的主要内容,如果未能解决你的问题,请参考以下文章

tymon/jwt-auth Laravel:无法验证令牌签名

尝试解码 Jwt 令牌时出现“尝试解码 Jwt 时发生错误:无法检索远程 JWK 集:”错误

无法读取未定义的属性“代码”,解码 Firebase ID 令牌失败

OpenIdDict 多个授权服务器无法解码相同的访问令牌

如何从节点 api 中的获取请求中解码 JWT 令牌

令牌身份验证失败:“utf-8”编解码器无法解码位置 0 中的字节 0xe4:无效的继续字节