如何在React Native+Expo的Supabase Facebook认证中获取大尺寸头像?
解决Supabase Facebook认证头像尺寸过小的问题
直接修改JWT里的头像URL参数无效,是因为Facebook的头像URL规则特殊,默认返回的小图URL不支持直接调整尺寸。可以按以下两种方式解决:
方法一:通过Facebook Graph API获取大尺寸头像
登录成功拿到Facebook的access_token后,直接调用Graph API请求指定尺寸的头像:
具体实现:
在现有登录逻辑中,添加获取大图的代码:
async function login() { const { data, error } = await supabase.auth.signInWithOAuth({ provider: 'facebook', }) if(data?.url) { let result = await WebBrowser.openAuthSessionAsync(data.url, Linking.createURL()) if(result.type == 'success') { const access_token = result.url.split('#')[1].split('&')[0].replace('access_token=', '') // 新增:请求大尺寸头像 const avatarRes = await fetch(`https://graph.facebook.com/v18.0/me/picture?width=200&height=200&redirect=false&access_token=${access_token}`) const avatarData = await avatarRes.json() const largeAvatarUrl = avatarData.data.url // 可选:将大图URL更新到Supabase用户元数据 await supabase.auth.updateUser({ data: { avatar_url: largeAvatarUrl } }) await SecureStore.setItemAsync('access_token', access_token) // 可选:将大图URL存本地 await SecureStore.setItemAsync('avatar_url', largeAvatarUrl) } } }
redirect=false让接口返回JSON格式数据,直接提取大图URLwidth和height可按需调整(比如400×400)
之后无论从Supabase用户信息还是本地存储中读取,都是大尺寸头像。
方法二:修改Supabase OAuth配置(直接获取大图)
如果希望Supabase在认证阶段直接获取大尺寸头像,可在初始化Supabase时配置Facebook provider的参数:
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, { auth: { providers: { facebook: { options: { authUrlParams: { // 指定获取大尺寸头像字段 fields: 'id,name,picture.width(200).height(200)' } } } } } })
这样Supabase在拉取用户信息时,会直接拿到Facebook返回的大尺寸头像URL,JWT中的avatar_url就会是大图地址。
注意:需确保Supabase的OAuth配置已包含public_profile权限(默认已自带),否则无法获取头像字段。
内容的提问来源于stack exchange,提问作者Ryan Clare
相关产品推荐
相关产品推荐

