
在使用firebase authentication的openid connect (oidc) 功能与twitch进行集成时,开发者可能会遇到一个常见问题:用户通过twitch成功登录后,在firebase控制台中创建的用户记录中,其“标识符”(通常是用户的电子邮件地址)字段却显示为空。这导致用户档案信息不完整,影响后续的用户管理和个性化服务。
此问题的根源在于OpenID Connect协议的运作方式以及身份提供商(IdP,此处为Twitch)默认提供的信息范围。当您的应用程序通过OIDC向Twitch请求用户认证时,Twitch默认可能不会将用户的电子邮件地址作为标准声明(claims)返回。Firebase作为中间层,接收到Twitch返回的信息后,如果其中不包含电子邮件地址,便无法填充用户记录中的相应字段。因此,我们需要明确告知Twitch,我们需要获取用户的电子邮件地址。
解决此问题的关键在于在Firebase OAuth Provider的配置中,通过setCustomParameters方法,显式地向Twitch请求包含用户电子邮件地址的声明。OpenID Connect协议允许客户端在认证请求中指定所需的用户信息声明。这些声明通过JSON格式在claims参数中传递。
具体而言,我们需要在provider.setCustomParameters()中添加一个claims字段,其值是一个JSON字符串,用于指定我们希望从userinfo端点获取哪些声明,例如电子邮件地址(email)、电子邮件是否已验证(email_verified)等。
Firebase OIDC 配置: 在Firebase控制台中,导航至“Authentication” -> “Sign-in method”,启用“OpenID Connect”提供商。确保“发行方(URL)”字段设置为Twitch的OpenID Connect发行方URL:https://id.twitch.tv/oauth2。
前端代码实现: 在您的JavaScript代码中,初始化Firebase OAuth Provider时,需要特别配置setCustomParameters方法,以包含所需的claims。
// 获取Twitch登录按钮元素
const twitchsigninBtn = document.getElementById('twitchsigninBtn');
// 初始化Twitch OAuth Provider
// 'oidc.twitch' 是在Firebase控制台配置OpenID Connect提供商时自定义的ID
var provider = new firebase.auth.OAuthProvider('oidc.twitch');
// 配置Twitch自定义参数,显式请求用户信息声明
provider.setCustomParameters({
// force_verify: 'true' 强制用户在每次登录时重新授权,确保最新权限状态
force_verify: 'true',
// claims: 请求特定的用户信息声明
// userinfo: {} 表示请求来自userinfo端点的声明
// email: null 表示请求email声明
// email_verified: null 表示请求email_verified声明
// picture: null 表示请求用户头像URL
// updated_at: null 表示请求用户资料更新时间
// 注意:claims的值必须是一个JSON字符串
claims: '{"userinfo":{"email":null,"email_verified":null,"picture":null,"updated_at":null}}'
});
// 为Twitch登录按钮添加点击事件监听器
twitchsigninBtn.onclick = () => {
// 调用Firebase的signInWithPopup方法启动登录流程
firebase.auth().signInWithPopup(provider)
.then((result) => {
// 登录成功回调
// IdP (Identity Provider,此处为Twitch) 返回的数据可在 result.additionalUserInfo.profile 中获取
console.log("Twitch 登录成功!");
console.log("Firebase 用户对象:", result.user);
console.log("Twitch 原始资料:", result.additionalUserInfo.profile);
/** @type {firebase.auth.OAuthCredential} */
var credential = result.credential;
// OAuth 访问令牌和 ID 令牌也可以在此处获取
var accessToken = credential.accessToken;
var idToken = credential.idToken;
console.log("访问令牌 (accessToken):", accessToken);
console.log("ID 令牌 (idToken):", idToken);
// 此时,Firebase 用户对象中的 email 字段应已填充
if (result.user.email) {
console.log("用户邮箱已成功获取:", result.user.email);
} else {
console.warn("用户邮箱未获取到,请检查 claims 配置。");
}
})
.catch((error) => {
// 登录失败回调,处理各种错误
console.error("Twitch 登录失败:", error);
// 根据错误代码进行具体处理
switch (error.code) {
case 'auth/popup-closed-by-user':
console.log("用户关闭了登录弹窗。");
break;
case 'auth/cancelled-popup-request':
console.log("上次登录请求已被取消。");
break;
case 'auth/operation-not-allowed':
console.log("操作未被允许,请检查Firebase认证设置。");
break;
default:
console.error("发生未知错误:", error.message);
}
});
};通过在Firebase OpenID Connect的OAuthProvider中正确配置setCustomParameters并指定所需的claims,您可以确保从Twitch等身份提供商那里获取到完整的用户数据,特别是关键的电子邮件地址。这不仅完善了Firebase的用户档案,也为后续的用户管理、个性化服务以及用户体验优化奠定了基础。理解并正确利用OpenID Connect的声明机制,是构建健壮认证系统的关键一环。务必在开发过程中充分测试,并关注用户隐私和权限管理。
以上就是Firebase与Twitch OIDC集成:确保用户邮箱信息的正确获取的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号