基于Flask JWT的密码授权登录界面,用户认证

今天给大家推荐一个非常好用,便于移植的开源项目 -------- login-test

项目地址:https://github.com/ikiwihome/login-test

login-test 密码授权登录

这个项目是一个基于Flask框架的Web应用,包含了用户认证功能。

应用首页通过验证Token判断用户是否已登录,若未登录则跳转至登录页面。

登录页面接收用户输入的密码并验证,若验证通过则生成Token并保存至Cookie,跳转至首页。

logout页面接收用户的请求,删除保存在Cookie中的Token,跳转回登录页面。

整个应用使用JWT算法进行Token的加密与解密。

特点

  1. 前端采用Bootstrap 5.3,界面美观 基于Flask轻量化框架,代码简单,注释丰富
  2. 前端登录时密码以密文形式传输,避免被第三方截获,非常安全
  3. 验证通过后,以token形式保存在本地浏览器中,token有效期默认90天,期间免登录,可自行修改token有效期
  4. 登录密码以/data/password文本形式保存在本地,便于随时修改 支持docker部署 上手简单,免修改代码 占用资源小 ️

预览截图

登录界面

在这里插入图片描述

登录后的主页面

在这里插入图片描述

后端Flask代码

# -*- coding: utf-8 -*-
import os, hashlib, jwt
from flask import Flask, request, make_response, render_template, redirect, url_for
from datetime import datetime, timedelta

app = Flask(__name__)

# 随机的高强度密钥
app.secret_key = 'vN8Tq6grBKAl9ZOh6i71Or6'
password_file = './data/password'
default_pw = 'admin'

# token 90天后过期
max_age = 90 * 24 * 60 * 60  # 90天 * 24小时 * 60分钟 * 60秒

@app.route('/')
def index():
    token = request.cookies.get('token')
    if validate_token(token):
        return render_template('index.html')
    else:
        return redirect(url_for('login'))

@app.route('/login', methods=['GET', 'POST'])
def login():
    # 如果文件不存在则创建默认密码文件
    if not os.path.exists(password_file):
        os.makedirs(os.path.dirname(password_file), exist_ok=True)
        with open(password_file, 'w') as f:
            f.write(default_pw)

    # 读取密码文件
    with open(password_file) as f:
        default_password = f.read().strip()

    # 生成密码的哈希值
    hashed_stored = hashlib.sha256(default_password.encode("utf-8")).hexdigest()

    if request.method == 'POST':
        # 从表单中获取密码
        hashed_password = request.form['hash']
        # 验证密码的正确性
        if hashed_password == hashed_stored:
            # 如果密码验证通过
            token = generate_token()
            # 生成一个令牌
            resp = make_response(redirect(url_for('index')))
            # 创建一个重定向响应对象,跳转到相册页面
            resp.set_cookie('token', token, max_age=max_age)
            # 设置cookie,保存令牌,设置过期时间为max_age
            return resp
            # 返回响应对象
        else:
            # 如果密码验证不通过
            return render_template('login.html', error='密码输入错误!')
            # 返回登录页面模板,并传递错误信息
    return render_template('login.html')
    # 返回登录页面模板


@app.route('/logout')
def logout():
    # 生成一个响应对象并重定向到登录页面
    resp = make_response(redirect(url_for('login')))
    # 设置一个名为'token'的cookie,过期时间为0
    resp.set_cookie('token', '', expires=0)
    # 返回响应对象
    return resp


def generate_token():
    # 获取当前时间加上90天
    expiration = datetime.utcnow() + timedelta(days=90)

    # 定义一个字典,包含一个键值对,键为'exp',值为expiration
    data = {
        'exp': expiration
    }

    # 使用jwt.encode()函数将data字典进行编码,使用app.secret_key作为密钥,algorithm参数指定加密算法为'HS256'
    token = jwt.encode(data, app.secret_key, algorithm='HS256')

    # 返回编码后的token
    return token


def validate_token(token):
    try:
        # 尝试解码token
        data = jwt.decode(token, app.secret_key, algorithms=['HS256'])
        # 获取token的过期时间
        expired_date = data.get('exp')
        # 如果过期时间不存在,则返回False
        if expired_date is None:
            return False
        # 将过期时间转换为时间戳
        print_date = datetime.fromtimestamp(expired_date)
        # 将过期时间格式化为指定格式的字符串
        print(print_date.strftime('%Y-%m-%d %H:%M:%S'))
        # 返回True表示token有效
        return True
    # 如果token已过期,执行以下代码
    except jwt.ExpiredSignatureError:
        # 返回False表示token无效
        return False
    # 如果token无效,执行以下代码
    except jwt.InvalidTokenError:
        # 返回False表示token无效
        return False


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=65432, debug=True)

使用运行教程

安装依赖的python库

pip install flask flask_jwt_extended

直接运行

python app.py

构建docker镜像

docker build -t login-test .
docker tag login-test login-test:latest

在docker容器中运行

docker run -d --name login-test -h login-test --restart=unless-stopped -e TZ="Asia/Shanghai" -v /data/login-test:/app/data login-test:latest

默认端口号为65432

默认密码:admin

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个基于Flask框架的用户登录系统的示例代码: ```python from flask import Flask, render_template, request, redirect, url_for, session app = Flask(__name__) app.secret_key = 'my_secret_key' # 设置session秘钥 # 假设用户信息保存在一个字典中 users = { 'Alice': '123456', 'Bob': 'abcdef', 'Charlie': 'xyz123' } @app.route('/') def index(): if 'username' in session: # 如果用户登录,直接跳转到主页 return redirect(url_for('home')) else: # 如果用户登录,跳转到登录页面 return redirect(url_for('login')) @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] if username in users and password == users[username]: # 如果用户名和密码正确,将用户名保存在session中,并跳转到主页 session['username'] = username return redirect(url_for('home')) else: # 如果用户名或密码错误,显示错误信息 error = 'Invalid username or password' return render_template('login.html', error=error) else: # GET请求,显示登录页面 return render_template('login.html') @app.route('/home') def home(): if 'username' in session: # 如果用户登录,显示主页 return render_template('home.html', username=session['username']) else: # 如果用户登录,跳转到登录页面 return redirect(url_for('login')) @app.route('/logout') def logout(): # 登出操作,将保存在session中的用户名删除 session.pop('username', None) return redirect(url_for('login')) if __name__ == '__main__': app.run(debug=True) ``` 以上代码中,我们通过Flask框架实现了一个用户登录系统,包括以下几个功能: - 登录页面:用户需要输入用户名和密码才能登录。 - 主页:用户登录成功后,可以查看自己的用户名。 - 登出操作:用户可以随时登出,退出登录状态。 在实现过程中,我们使用了Flask的`session`功能来保存登录状态。具体来说,当用户登录成功后,我们将用户名保存在session中,当用户访问需要登录的页面时,我们检查session中是否存在用户名,如果存在,则表示用户登录,否则跳转到登录页面。 需要注意的是,在实际开发中,用户的信息通常不会保存在一个字典中,而是保存在数据库中。此处只是为了演示示例代码而采用了一个简单的字典来保存用户信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值