基于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
相关产品推荐
相关产品推荐

