Swift Auth0 访问代码导致未经授权的访问,但 Auth0 日志中没有任何内容

Posted

技术标签:

【中文标题】Swift Auth0 访问代码导致未经授权的访问,但 Auth0 日志中没有任何内容【英文标题】:Swift Auth0 access code results in unauthorized access but nothing in Auth0 logs 【发布时间】:2021-11-29 22:57:44 【问题描述】:

我有一个受 Auth0 保护的 nestJS 后端。通过在授权标头中包含访问令牌(Authorization: Bearer ACCESS_TOKEN),我能够从 react-admin 成功访问后端

但是,在尝试从 Swift ios 应用程序访问相同的后端时,我似乎遇到了问题。我已按照 Auth0 教程进行操作,并且能够确认成功的用户登录和访问用户配置文件。但是,当我尝试向 nestJS 后端发出请求时,我收到 401 Unauthorized 错误。有趣的是,Auth0 日志中没有记录任何内容。

Auth0 教程链接:https://auth0.com/docs/quickstart/native/ios-swift/04-calling-apis

let path = "\(baseURL)\(endpoint.rawValue)"
        
guard let url = URL(string: path)
else  preconditionFailure("Bad URL") 
        
var headers: [String:String] = [:]
headers["Content-Type"] = "application/json"
        
// if access token is set then set Authorization headers
if (accessToken != nil) 
    headers["Authorization"] = "Bearer \(accessToken!)"
    print("Bearer \(accessToken!)")

        
var request = URLRequest(url: url)
request.httpMethod = "\(method)"
request.allHTTPHeaderFields = headers
        
// check if body exists
if (body != nil) 
    request.httpBody = body!


let dataTask = URLSession.shared.dataTask(with: request) 
    (data, response, error) in
    guard error == nil
    else  completion(.failure(.serverError)); return 
            
    do 
        guard let data = data
        else  completion(.failure(.serverError)); return 
                
        guard let object : [[String: AnyObject]] = try JSONSerialization.object(with: data) as? [[String: AnyObject]]
        else 
            print("Unable to convert from data")
            return
        
        
        guard let json = try? JSONSerialization.data(withJSONObject: object, options: .prettyPrinted)
        else 
            print("Unable to prettify")
            return
        

        guard let jsonString = String(data: json, encoding: .utf8)
        else 
            print("Unable to convert to string")
            return
        
                
         print("JSON: \(jsonString)")
                
         completion(Result.success(object))
      catch 
         completion(Result.failure(.parsingError))
     

dataTask.resume()

baseURL 是一个指向我的nestJS 后端的字符串。 endpoint 是端点的枚举,例如\user

使用 Proxyman,我能够确认端点被正确的标头命中。截图如下。

此外,使用邮递员,我能够成功登录并对受保护的数据发出获取请求。截图如下。

任何想法可能是什么原因?如果我应该添加任何其他详细信息,请告诉我。

更新 我解码了成功的(react-admin)和不成功的(iOS)JWT 令牌,并注意到以下差异:

成功的 JWT 中的aud 包含一系列受众,其中包括在 Auth0 上注册的 API 以及 auth0 端点 https://xxxxx.us.auth0.com/userinfo

azp 仅存在于成功的 JWT 中并包含我的 clientID

不成功令牌中的aud包含clientID

不成功的令牌中缺少scopepermissions

附言。也发布在 Auth0 社区 https://community.auth0.com/t/access-token-when-obtained-from-ios-results-in-401-unauthorized-while-from-react-admin-is-ok/71115

【问题讨论】:

向前迈出一步,您是否使用调试器工具来跟踪网络请求?你能检查一下客户的要求吗?令牌是否附加成功并且在“授权”属性中? @novonimo 与 Proxyman 我能够确认设置了正确的标头并将其发送到端点。 你也可以从“邮递员”成功登录吗?您的后端是否可以正常使用邮递员 API 调用? @novonimo 确认成功登录并使用来自 Auth0 的访问令牌检索用户数据(更新后的帖子)。补充观察:现在,如果我将访问令牌与通过 iOS 设备获得的令牌交换,我会得到相同的错误...未经授权 是您在 swift 客户端中使用的“baseURL”,使用“https”还是“http”? 【参考方案1】:

问题是 audience 在从 react-admin 请求访问令牌时被设置,而我没有将它包含在快速登录实现中。

在 jwt.io 上解码 JWT 和以下线程得出这个结论。 https://community.auth0.com/t/access-token-too-short-jwt-malformed/9169/11?u=kennethphough

在以下代码中添加受众会导致返回正确的 jwt 并成功访问后端。

Auth0
    .authentication()
    .login(
        usernameOrEmail: self.email,
        password: self.password,
        realm: "Username-Password-Authentication",
        audience: "<YOUR_AUDIENCE>",     // <- This is what I forgot
        scope: "openid profile email"
)

【讨论】:

以上是关于Swift Auth0 访问代码导致未经授权的访问,但 Auth0 日志中没有任何内容的主要内容,如果未能解决你的问题,请参考以下文章

从 curl 使用 Auth0 调用 Laravel 5.3 API 时未经授权的用户

在 Auth0 中授权后访问令牌

无法显示网页,错误代码:500 这是怎么回事?应该怎么办?

如何让我的 Auth0 权限进入 AWS HTTP API Jwt 授权方的访问令牌的范围声明?

Auth0“找不到服务”错误

如何发布访问 REST api 的 jQuery 代码,但保护它免受未经授权的使用