专业的编程技术博客社区

网站首页 > 博客文章 正文

Python如何实现用户鉴权(python用户认证)

baijin 2024-09-10 11:02:13 博客文章 6 ℃ 0 评论

在 Python 中实现用户鉴权,可以根据不同的应用场景选择适合的技术方案。以下是几种常见的方法,涵盖从简单的用户验证到复杂的基于 JWT 和 OAuth 的方案。

1.使用 Flask-Login 实现用户鉴权

Flask-Login 是一个用于处理用户登录、会话和权限控制的 Flask 扩展,适合 Web 应用。

步骤

  • 安装 Flask-Login
pip install flask-login
  • 示例代码
from flask import Flask, redirect, url_for, render_template
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user

app = Flask(__name__)
app.secret_key = 'your_secret_key'

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'

# 用户模型
class User(UserMixin):
    def __init__(self, id):
        self.id = id

# 用户加载回调
@login_manager.user_loader
def load_user(user_id):
    return User(user_id)

@app.route('/login')
def login():
    user = User(id=1)  # 假设用户 ID 为 1
    login_user(user)
    return redirect(url_for('dashboard'))

@app.route('/dashboard')
@login_required
def dashboard():
    return f'Hello, {current_user.id}!'

@app.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('login'))

if __name__ == "__main__":
    app.run(debug=True)
  • 说明
    • login_user() 登录用户。
    • @login_required 确保特定路由只有登录用户才能访问。
    • 用户可以通过 session 管理登录状态。

2.基于 JWT 实现用户鉴权

JWT(JSON Web Token)是一种常用于无状态用户鉴权的方式,特别适合 API 和分布式系统中使用。常用库 Flask-JWT-Extended 可以帮助快速实现这一功能。

步骤

  • 安装 Flask-JWT-Extended
pip install flask-jwt-extended
  • 示例代码
from flask import Flask, jsonify, request
from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identity

app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'your_jwt_secret_key'
jwt = JWTManager(app)

@app.route('/login', methods=['POST'])
def login():
    username = request.json.get('username')
    password = request.json.get('password')

    # 假设用户名和密码的验证逻辑
    if username == 'test' and password == 'password':
        access_token = create_access_token(identity=username)
        return jsonify(access_token=access_token)
    return jsonify({"msg": "Bad credentials"}), 401

@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
    current_user = get_jwt_identity()
    return jsonify(logged_in_as=current_user), 200

if __name__ == "__main__":
    app.run(debug=True)
  • 说明
    • create_access_token() 用于生成 JWT。
    • @jwt_required() 确保访问此路由时,客户端提供有效的 JWT。

3.使用 Django 实现用户鉴权

在 Django 中,用户鉴权是内置的功能,Django Authentication 框架提供了便捷的方式处理用户登录和权限管理。

步骤

  • Django 内置用户系统
    • Django 内置了用户模型和鉴权系统,可以直接使用。
    • 使用 auth 模块的 authenticate() 和 login() 函数来验证用户身份并管理会话。
  • 示例代码
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required

def user_login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return redirect('dashboard')
        else:
            return render(request, 'login.html', {'error': 'Invalid login'})
    return render(request, 'login.html')

@login_required
def dashboard(request):
    return render(request, 'dashboard.html', {'user': request.user})

def user_logout(request):
    logout(request)
    return redirect('login')
  • 说明
    • authenticate() 验证用户的用户名和密码。
    • login() 将用户标记为已登录状态,并在会话中保存。
    • @login_required 确保用户必须登录后才能访问特定视图。

4.OAuth 2.0 与 OpenID Connect

如果你需要第三方登录(如 Google、Facebook),可以使用 OAuth 2.0 和 OpenID Connect 协议。

使用 Authlib 库实现 OAuth 2.0

Authlib 是一个支持 OAuth 和 OpenID Connect 的库,能够集成第三方登录。

  • 安装 Authlib
pip install authlib
  • 使用示例
from flask import Flask, redirect, url_for, session
from authlib.integrations.flask_client import OAuth

app = Flask(__name__)
app.secret_key = 'your_secret_key'
oauth = OAuth(app)

google = oauth.register(
    name='google',
    client_id='your_client_id',
    client_secret='your_client_secret',
    access_token_url='https://accounts.google.com/o/oauth2/token',
    authorize_url='https://accounts.google.com/o/oauth2/auth',
    client_kwargs={'scope': 'openid profile email'},
)

@app.route('/')
def index():
    return 'Welcome to OAuth 2.0 with Google'

@app.route('/login')
def login():
    return google.authorize_redirect(redirect_uri=url_for('authorize', _external=True))

@app.route('/authorize')
def authorize():
    token = google.authorize_access_token()
    user_info = google.get('userinfo').json()
    session['user'] = user_info
    return f"Hello, {user_info['name']}"

if __name__ == '__main__':
    app.run(debug=True)
  • 说明
    • Authlib 帮助处理 OAuth 流程,允许用户通过 Google 登录。
    • 用户登录后,google.get('userinfo') 获取用户信息。

5.手动管理用户鉴权

如果你想完全手动实现用户鉴权,可以通过 session、cookies 或 token 来存储和验证用户身份。以下是基于 session 的简单实现:

示例代码

from flask import Flask, session, redirect, url_for, request

app = Flask(__name__)
app.secret_key = 'your_secret_key'

@app.route('/login', methods=['POST', 'GET'])
def login():
    if request.method == 'POST':
        session['username'] = request.form['username']
        return redirect(url_for('dashboard'))
    return '''
        <form method="post">
            Username: <input type="text" name="username">
            <input type="submit">
        </form>
    '''

@app.route('/dashboard')
def dashboard():
    if 'username' not in session:
        return redirect(url_for('login'))
    return f'Hello, {session["username"]}!'

@app.route('/logout')
def logout():
    session.pop('username', None)
    return redirect(url_for('login'))

if __name__ == '__main__':
    app.run(debug=True)

总结

  • 简单的用户登录和会话管理:可以使用 Flask-Login 或 Django 自带的鉴权系统。
  • API 的鉴权:推荐使用基于 JWT 的方案,如 Flask-JWT-Extended。
  • 第三方登录集成:可以使用 OAuth 2.0 协议,通过库如 Authlib 来实现。

每天坚持学习一点点,不求有回报,只愿可以丰富自己!!!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表