移动端调用REST服务器:Google认证后POST请求遭401授权错误排查
我来帮你拆解下当前遇到的问题和疑问:
关于REST服务器是否通过Cookie返回令牌
Hyperledger Composer的REST服务器在OAuth2认证成功后,默认会通过HttpOnly、Secure类型的Cookie返回JWT令牌。但你的配置里successRedirect用的是myAuth://这种自定义URL协议,iOS应用在处理这类跳转时,没办法自动保存服务器设置的Cookie——因为自定义URL scheme的跳转上下文和常规HTTP请求的Cookie容器是相互隔离的,这就是你没收到服务器返回令牌的核心原因,后续POST请求自然因为缺少令牌而返回401。
关于withCredentials参数的凭据来源
withCredentials并不是用来“获取”凭据的,它只是一个开关:告诉HTTP客户端(比如你iOS里的网络请求库)在跨域请求时,自动携带当前请求域名对应的Cookie、HTTP认证信息等凭据。但因为前面提到的Cookie没被保存下来,这个参数就没有可携带的凭据,请求还是会因为缺少令牌被服务器拒绝。
建议的解决方案
改用中间页面传递令牌:把
successRedirect改成你的REST服务器域名下的一个静态页面(比如https://your-rest-server.com/auth/success),在这个页面里用JavaScript从Cookie中取出JWT令牌,再通过自定义协议传递给iOS应用,比如:const jwtToken = document.cookie.split('; ').find(row => row.startsWith('composer-access-token=')).split('=')[1]; window.location.href = `myAuth://?token=${jwtToken}`;这样你的iOS应用就能从URL参数里拿到令牌,后续POST请求直接把令牌放在
Authorization: Bearer <token>请求头里即可,不用依赖Cookie。检查CORS和Cookie配置:确保你的REST服务器CORS配置允许iOS应用的请求来源,并且开启了
credentials支持;同时确认COMPOSER_PROVIDERS里的callbackURL是正确的,REST服务器能正常处理回调并生成Cookie。
附上你提供的COMPOSER_PROVIDERS配置:
COMPOSER_PROVIDERS='{ "google": { "provider": "google", "module": "passport-google-oauth2", "clientID": "93505970627.apps.googleusercontent.com", "clientSecret": "", "authPath": "/auth/google", "callbackURL": "/auth/google/callback", "scope": "https://www.googleapis.com/auth/plus.login", "successRedirect": "myAuth://", "failureRedirect": "/" } }'
内容的提问来源于stack exchange,提问作者Jamil Ahmed

