如何在Supabase的Google OAuth中请求用户同意获取生日、性别及手机号?
关于Supabase Google OAuth请求生日、性别和手机号权限的问题解答
你当前的写法可以通过OAuth授权流程请求用户同意共享这些信息,但有几个关键细节需要注意:
权限范围(Scopes)要精准
你写的birthdate、gender不是Google官方认可的标准scope,得换成对应People API的权限:- 生日:
https://www.googleapis.com/auth/user.birthday.read - 性别:
https://www.googleapis.com/auth/user.gender.read - 手机号:
https://www.googleapis.com/auth/userinfo.phone
修正后的scopes配置要确保Google能识别并弹出对应的授权请求。
- 生日:
Supabase不会自动返回所有字段
就算用户授权了,Supabase的默认user对象里只会包含基础信息(比如邮箱、姓名),生日、性别、手机号这类额外字段需要你用登录后拿到的provider_token(也就是Google的access_token)去调用Google People API主动获取。额外配置不能少
必须在Google Cloud Console里启用People API,否则调用接口会直接报错;另外,如果你的应用是公开上线的,手机号这类敏感权限需要提交Google的应用验证,不然普通用户授权时会看到"应用未验证"的警告,甚至没法完成授权。
修正后的登录代码示例
const { data, error } = await auth.signInWithOAuth({ provider: 'google', options: { queryParams: { access_type: 'offline', prompt: 'consent', }, // 替换为标准的Google权限scope scopes: 'profile https://www.googleapis.com/auth/userinfo.phone https://www.googleapis.com/auth/user.birthday.read https://www.googleapis.com/auth/user.gender.read', redirectTo: window.location.origin + '/api/login', }, });
授权后获取额外信息的示例
登录成功后,从Supabase会话里拿到access_token,调用People API拉取数据:
// 获取当前用户会话 const session = await auth.getSession(); if (session?.provider_token) { try { const response = await fetch( 'https://people.googleapis.com/v1/people/me?personFields=birthdays,genders,phoneNumbers', { headers: { 'Authorization': `Bearer ${session.provider_token}` } } ); const userDetails = await response.json(); // 这里可以拿到生日、性别、手机号数据 console.log('用户额外信息:', userDetails); } catch (apiError) { console.error('获取用户信息失败:', apiError); } }
内容的提问来源于stack exchange,提问作者Shivam Sahil
相关产品推荐
相关产品推荐

