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
不成功的令牌中缺少scope
和permissions
。
附言。也发布在 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 时未经授权的用户