python中JWT用户认证的实现

  

以下是 "Python 中 JWT 用户认证的实现" 的完整攻略。

第一步:什么是 JWT

JWT (JSON Web Token),即用于 Web 应用程序和 API (应用程序接口) 进行认证的开放标准 (RFC 7519)。JWT 是一种轻量级的身份验证和授权机制,旨在为客户端与服务器之间的信息传输提供安全的方式。

JWT 可以通过在 Authorization 请求头中添加 Bearer + token 的方式来进行身份验证。

JWT 架构包含三部分:头部、载荷和签名。其中,头部通常包括声明类型、算法等;载荷一般包括声明、过期时间等信息;签名则是将头部和载荷使用指定算法加密后得到的密文,用于验证消息的完整性和真实性。

第二步:安装 JWT 库

在 Python 中使用 JWT,需要先安装 JWT 库。打开终端,输入以下命令:

pip install pyjwt

成功安装后,即可在代码中引入并使用 JWT 库。

import jwt

第三步:生成 JWT token

生成 JWT token 通常需要指定以下信息:

  • Payload (载荷):包含需要传输的用户信息,如用户名、用户 ID 等。
  • Secret (密钥):用于对 JWT 进行签名的密钥。

下面以一个示例代码来说明:

import jwt

payload = {'user_id': 10, 'username': 'jack'}
secret = 'secretkey'

token = jwt.encode(payload, secret, algorithm='HS256')

print(token)

这段代码中,payload 包含了用户信息,secret 则是用于加密的密钥。jwt.encode() 方法用于将信息加密生成一个 JWT token,并返回该 token。

第四步:解析 JWT token

在服务器端接收到请求时,需要对 JWT token 进行解析,以验证用户身份。解析 JWT token 通常需要指定以下信息:

  • Token (令牌):要解析的 JWT 令牌。
  • Secret (密钥):用于对 JWT 进行签名的密钥。

以下是一个示例代码:

import jwt

token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMCwidXNlcm5hbWUiOiJqYWNrIn0.0yMkOnH6BHV8NT9VswalEc97950OeSZ514Fu5f9dM-c'
secret = 'secretkey'

payload = jwt.decode(token, secret, algorithms=['HS256'])

print(payload)

这段代码中,token 是要解析的 JWT 令牌,secret 是用于解密的密钥。jwt.decode() 方法用于解析 JWT token,并返回包含用户信息的 payload。

示例说明一:Flask 中的 JWT 实现

下面以一个 Flask 框架的例子来说明如何在 Flask 应用中使用 JWT 进行用户认证。

首先,需要在 Flask 中引入 JWT 库。

from flask import Flask, request
import jwt

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secretkey'

接下来,定义一个请求处理函数 /login,用于生成 JWT token。

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

    if username == 'admin' and password == 'admin123':
        payload = {'username': username}
        token = jwt.encode(payload, app.config['SECRET_KEY'], algorithm='HS256')
        return {'token': token}

    return 'Invalid username or password.', 401

login 函数中,使用 request.form 来获取表单提交的用户名和密码,并进行验证。验证通过后,使用 JWT 库生成 JWT token,并返回给用户。

最后,定义一个请求处理函数 /protected,用于保护需要认证的资源。

@app.route('/protected', methods=['GET'])
def protected():
    token = request.headers.get('Authorization').replace('Bearer ', '', 1)

    try:
        payload = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
    except jwt.InvalidTokenError:
        return 'Invalid token.', 401

    return f'Hello, {payload["username"]}!'

/protected 函数中,使用 request.headers 来获取 JWT token,解析 token 并获取其中的用户信息。如果 token 无效,则返回错误信息。

示例说明二:Django 中的 JWT 实现

下面以一个 Django 框架的例子来说明如何在 Django 应用中使用 JWT 进行用户认证。

首先,需要在 Django 中引入 JWT 库。

import jwt

from django.http import JsonResponse

接下来,定义一个请求处理函数 /login,用于生成 JWT token。

def login(request):
    username = request.POST.get('username')
    password = request.POST.get('password')

    if username == 'admin' and password == 'admin123':
        payload = {'username': username}
        token = jwt.encode(payload, 'secretkey', algorithm='HS256')
        return JsonResponse({'token': token})

    return JsonResponse({'message': 'Invalid username or password.'}, status=401)

login 函数中,使用 request.POST 来获取表单提交的用户名和密码,并进行验证。验证通过后,使用 JWT 库生成 JWT token,并返回给用户。

最后,定义一个请求处理函数 /protected,用于保护需要认证的资源。

def protected(request):
    token = request.META.get('HTTP_AUTHORIZATION').replace('Bearer ', '', 1)

    try:
        payload = jwt.decode(token, 'secretkey', algorithms=['HS256'])
    except jwt.InvalidTokenError:
        return JsonResponse({'message': 'Invalid token.'}, status=401)

    return JsonResponse({'message': f'Hello, {payload["username"]}!'})

/protected 函数中,使用 request.META 来获取 JWT token,解析 token 并获取其中的用户信息。如果 token 无效,则返回错误信息。

相关文章