Vapor 4集成Sign in with Apple遇JSON格式错误求助
Vapor 4 Apple登录验证报错排查建议
问题描述
在Vapor 4中实现Sign in with Apple功能时,无论将用户token放在请求体还是请求头(Bearer)中,调用API均返回JSON解析错误:
{ "error": true, "reason": "Data corrupted at path ''. The given data was not valid JSON. Underlying error: Error Domain=NSCocoaErrorDomain Code=3840 \"Invalid value around line 1, column 0.\" UserInfo={NSDebugDescription=Invalid value around line 1, column 0., NSJSONSerializationErrorIndex=0}." }
两种实现代码
1. Token放在请求体的实现
func SignInWithApple(req: Request)async throws -> Token{ // 解析请求体成功 let data = try req.content.decode(SignInWithAppleToken.self) // iOS应用的Bundle ID guard let appIdentifier = Environment.get("ios_app_id") else{ throw Abort(.internalServerError) } // 错误发生在此行 let siwaToken = try await req.jwt.apple.verify(data.token, applicationIdentifier: appIdentifier) print(siwaToken) // 剩余业务逻辑 }
2. Token放在请求头(Bearer)的实现
func routes(_ app: Application) throws { app.jwt.apple.applicationIdentifier = "iOS_app_bundle_Id" app.get("apple") { req async throws -> HTTPStatus in let token = try await req.jwt.apple.verify() print(token) // AppleIdentityToken return .ok } }
Postman请求方式
1. 请求体传参

2. 请求头(Bearer)传参

解决建议
- 确认请求内容类型:Postman请求需将
Content-Type设置为application/json,请求体的JSON格式要严格规范,不能有多余空格或语法错误。 - 校验Token格式:确保传入的token是完整的JWT字符串(由header、payload、signature三部分通过
.分隔组成),避免复制时遗漏字符或引入多余符号。 - 修正应用标识符配置:
applicationIdentifier需设置为Team ID + Bundle ID的完整组合(例如ABCDE12345.com.yourcompany.yourapp),而非单纯的Bundle ID,Apple验证时要求使用完整标识符。 - 添加详细错误捕获:在
verify方法调用处增加错误分支,区分JWT验证错误与JSON解析错误,便于定位问题:do { let siwaToken = try await req.jwt.apple.verify(data.token, applicationIdentifier: appIdentifier) print(siwaToken) } catch let error as JWTError { print("JWT验证错误:\(error)") throw error } catch { print("其他错误:\(error)") throw error } - 检查环境变量:第一种实现中,确认
ios_app_id环境变量已正确配置,值为完整的Apple应用标识符,避免空值导致验证逻辑异常。 - 注意GET请求规范:第二种实现使用
GET请求,GET请求通常不携带请求体;测试Bearer头时,确保Authorization头格式为Bearer <完整token>,无多余空格或拼写错误。
内容的提问来源于stack exchange,提问作者khawlah
相关产品推荐
相关产品推荐

