以下是 "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 无效,则返回错误信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python中JWT用户认证的实现 - Python技术站