Swift 5中Moya网络层添加Bearer令牌失败,Laravel后端报错排查
解决Moya请求Laravel后端时"Personal access client not found"错误
这个错误通常来自两个核心原因:请求头的Bearer令牌格式有误,或者Laravel后端的Passport个人访问客户端未正确配置,下面一步步来修复:
1. 修正Moya中的Authorization请求头格式
看你的代码,手动添加Authorization头时写了"Bearer+\(Constant.accesstoken.token)",这里的+是错误的——正确的Bearer令牌格式应该是Bearer (注意空格)加上令牌字符串。而且你已经实现了AccessTokenAuthorizable协议并返回.bearer,Moya本身会自动帮你处理Bearer认证,手动添加反而可能导致头信息冲突。
两种修复方式选其一:
方式一:移除手动添加的Authorization头(推荐)
依赖Moya的自动处理能力,只保留Content-Type即可:
var headers: [String : String]? { switch self { case .addProperty(_, _, _, _, _, _, _, _, _): // 仅保留multipart/form-data类型,Authorization由Moya自动注入 return ["Content-Type": "multipart/form-data"] } }
同时初始化Provider时,通过AccessTokenPlugin传入令牌:
var provider = MoyaProvider<Service>(plugins: [AccessTokenPlugin(tokenClosure: { return Constant.accesstoken.token })])
方式二:修正手动添加的令牌格式
如果坚持手动添加头信息,把加号换成空格:
return ["Content-Type": "multipart/form-data", "Authorization": "Bearer \(Constant.accesstoken.token)"]
2. 确保Laravel后端创建了个人访问客户端
这个错误是Laravel Passport的典型提示,说明后端还未生成个人访问客户端,按以下步骤操作:
- 在Laravel项目根目录运行Artisan命令:
php artisan passport:client --personal - 命令执行后会生成客户端ID和密钥,将它们配置到项目的
.env文件中:PASSPORT_PERSONAL_ACCESS_CLIENT_ID=生成的客户端ID PASSPORT_PERSONAL_ACCESS_CLIENT_SECRET=生成的客户端密钥 - 最后检查
config/auth.php中api守卫的驱动是否设置为passport:'guards' => [ 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
完成以上两步后重新测试请求,应该就能解决这个错误了。
内容的提问来源于stack exchange,提问作者Ekramul Hoque
相关产品推荐
相关产品推荐

