Expo Facebook.useAuthRequest报Invalid code verifier错误问询
报错根因
该错误是因为expo-auth-session默认开启**PKCE(代码交换证明密钥)**安全授权流程,你手动拼接参数调用Facebook换token接口时,缺失了PKCE流程强制校验的code_verifier参数;且你使用的Facebook Graph API v7.0版本已强制开启PKCE校验,未传符合规则的参数就会返回错误码1的OAuthException异常。
code_verifier不需要你手动生成,是SDK每次发起授权请求时自动生成的加密随机字符串。
可落地解决方案
方案1:使用SDK封装方法(推荐,避免参数拼接错误)
不要自己手动请求Graph API换token接口,直接调用expo-auth-session内置的exchangeCodeAsync方法,SDK会自动传入匹配的code_verifier、校验参数一致性,示例代码如下:
import * as Facebook from 'expo-auth-session/providers/facebook'; import { ResponseType } from 'expo-auth-session'; import { useEffect } from 'react'; // 发起授权请求 const [request, response, promptAsync] = Facebook.useAuthRequest({ clientId: '你的Facebook应用Client ID', responseType: ResponseType.Code, }); // 监听授权结果 useEffect(() => { const getToken = async () => { if (response?.type === 'success') { const { code } = response.params; // 调用封装好的换token方法,自动处理code_verifier传参 const tokenRes = await Facebook.exchangeCodeAsync({ clientId: '你的Facebook应用Client ID', clientSecret: '你的Facebook应用Client Secret', code, // 必须使用发起请求时生成的redirectUri,不能手动硬编码避免不一致 redirectUri: request.redirectUri, }); // tokenRes.accessToken 即为最终获取到的Facebook访问令牌 console.log('获取到的accessToken:', tokenRes.accessToken); } }; getToken(); }, [response]);
方案2:手动调用接口时补传code_verifier参数
如果业务需要自行请求Graph API接口,直接从useAuthRequest返回的request对象中取当次请求生成的codeVerifier字段,拼到请求参数中即可,请求参数示例:
GET https://graph.facebook.com/v7.0/oauth/access_token ?client_id=你的Facebook应用ClientID &redirect_uri=和发起授权时完全一致的回调地址 &client_secret=你的Facebook应用ClientSecret &code=授权成功返回的code值 &code_verifier=${request.codeVerifier}
避坑提示
- 换token时传入的
redirect_uri必须和发起授权请求时的redirectUri完全一致,末尾斜杠、路径、参数不能有任何差异,否则也会触发校验失败 - 每次发起授权请求SDK都会生成新的
codeVerifier,必须使用当次授权请求对应的值,不能硬编码固定值复用 - Expo SDK 45运行在iOS端、Expo Go环境时不要手动关闭PKCE配置,否则会触发系统层面的授权安全拦截
内容的提问来源于stack exchange,提问作者Duke
相关产品推荐
相关产品推荐

