You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Flask与Pyrebase的Firebase Auth:如何判断已注册邮箱是否已验证?

如何用Pyrebase判断Firebase Auth邮箱是否已验证

嘿,我之前也用Flask+Pyrebase做过类似的项目,刚好碰到过这个问题!其实Firebase Auth提供了getAccountInfo接口来获取用户的详细信息,包括邮箱验证状态,Pyrebase已经封装了这个方法,我来给你具体说怎么实现:

核心思路

要判断邮箱是否验证,你需要通过用户的idToken调用Firebase Auth的账户信息接口,返回的结果里会包含emailVerified字段,直接读取这个布尔值就可以了。

具体实现步骤

1. 在登录时检查邮箱验证状态

首先,在用户登录的路由里,当用户成功登录后,获取idToken并调用auth.get_account_info()方法:

from flask import Flask, render_template, redirect, url_for, flash, session
import pyrebase

# 初始化Pyrebase(这里假设你已经完成了初始化配置)
config = {
    # 你的Firebase配置
}
firebase = pyrebase.initialize_app(config)
auth = firebase.auth()

@app.route('/login', methods=['GET', 'POST'])
def login_page():
    form = LoginForm()  # 假设你有对应的登录表单类
    if form.validate_on_submit():
        try:
            # 登录获取用户信息
            user = auth.sign_in_with_email_and_password(form.email_address.data, form.password.data)
            
            # 获取账户详细信息
            account_info = auth.get_account_info(user['idToken'])
            
            # 提取邮箱验证状态
            is_email_verified = account_info['users'][0]['emailVerified']
            
            if not is_email_verified:
                flash('请先完成邮箱验证后再登录!', category='warning')
                return redirect(url_for('login_page'))
            
            # 验证通过,保存会话信息
            session['local_id'] = user['localId']
            session['id_token'] = user['idToken']
            session['refresh_token'] = user['refreshToken']
            
            flash('登录成功!', category='success')
            return redirect(url_for('market_page'))
        except Exception as e:
            flash('邮箱或密码错误,请重试!', category='danger')
    
    return render_template('login.html', form=form)

2. 用装饰器保护需要验证邮箱的页面

如果你的应用有某些页面需要用户必须验证邮箱才能访问,可以写一个装饰器来统一处理:

from functools import wraps

def email_verified_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        # 检查用户是否已登录
        if 'id_token' not in session:
            flash('请先登录!', category='warning')
            return redirect(url_for('login_page'))
        
        try:
            # 调用接口获取账户信息
            account_info = auth.get_account_info(session['id_token'])
            user_info = account_info['users'][0]
            
            # 检查邮箱验证状态
            if not user_info['emailVerified']:
                flash('请先验证你的邮箱才能访问此页面!', category='warning')
                return redirect(url_for('login_page'))
            
            # 处理token过期的情况(可选)
            if user_info.get('expiresIn') and int(user_info['expiresIn']) < 3600:
                # 刷新token
                refreshed_user = auth.refresh(session['refresh_token'])
                session['id_token'] = refreshed_user['idToken']
                session['refresh_token'] = refreshed_user['refreshToken']
                
        except Exception as e:
            # token无效或过期,重新登录
            flash('会话已过期,请重新登录!', category='danger')
            return redirect(url_for('login_page'))
        
        return f(*args, **kwargs)
    return decorated_function

# 使用装饰器保护路由
@app.route('/market')
@email_verified_required
def market_page():
    # 页面逻辑
    return render_template('market.html')

关键说明

  • auth.get_account_info(id_token)返回的是一个字典,其中users是一个数组,第一个元素就是当前用户的所有信息,包含emailVerified、email、localId等字段。
  • 要注意idToken是有有效期的(默认1小时),所以如果用户会话持续时间较长,建议在装饰器里加入token刷新的逻辑,避免调用接口时出错。
  • 在注册时你已经调用了auth.send_email_verification(sign_in['idToken'])发送验证邮件,用户点击邮件链接后,emailVerified就会变成True。

内容的提问来源于stack exchange,提问作者vandit vasa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 12:32:45