如何在react-native-app-auth的令牌交换请求体中传递client_id和client_secret?
解决react-native-app-auth令牌交换时缺少client_id和client_secret的问题
我之前也碰到过一模一样的情况!很多自定义OAuth服务器不遵循默认的Basic Auth认证逻辑,反而要求把client_id和client_secret直接放在令牌交换POST请求的请求体里,而react-native-app-auth默认是用HTTP Basic Auth头来传递这两个参数的,这就导致服务器返回401未授权错误。
核心解决方案:指定令牌认证方式
你只需要在配置里添加tokenEndpointAuthMethod: 'client_secret_post',这个参数会强制库把client_id和client_secret放到POST请求体中,而不是用Basic Auth头传递。
修改后的完整配置代码:
const config = { issuer: 'https://example.dev', clientId: client_id, clientSecret: client_secret, redirectUrl: 'myapp://auth_success', scopes: scopes, // 关键配置:告诉库用POST请求体传递客户端凭证 tokenEndpointAuthMethod: 'client_secret_post', serviceConfiguration: { tokenEndpoint: 'https://example.dev/access-token', authorizationEndpoint: 'https://example.dev', // 注意移除原URL末尾多余的问号 } };
为什么之前的尝试没用?
- 用
additionalParameters传递这两个参数时,库可能会因为默认的认证逻辑,同时在Basic Auth头和请求体里都放置这些参数,反而引发服务器的参数冲突; customHeaders是用来添加自定义请求头的,和请求体参数完全是两个位置,自然不会被服务器识别。
额外注意点
如果你的服务器要求用multipart/form-data格式接收请求体,你可能需要额外配置参数编码方式,但大部分情况下,client_secret_post配合默认的application/x-www-form-urlencoded格式就能满足需求。
内容的提问来源于stack exchange,提问作者Luke Rogerson
相关产品推荐
相关产品推荐

