实现基于TokenAuthentication()的Python用户登录系统
Token是一种用于身份验证的方式,通过生成一个随机的字符串作为Token,并将其与用户关联,可以实现无需传统的用户名和密码来进行用户登录的功能。在Python中,我们可以使用Django框架提供的TokenAuthentication()来实现这样的用户登录系统。
首先,需要确保已经安装了Django框架。可以使用以下命令安装Django:
pip install django
接下来,创建一个新的Django项目,使用以下命令:
django-admin startproject user-login
进入项目目录,并创建一个新的app,使用以下命令:
cd user-login django-admin startapp userApp
现在,在userApp目录下创建一个新的文件tokens.py,用于生成和验证用户的Token。在该文件中,需要引入Django的Token类和datetime模块,示例代码如下:
from django.utils.crypto import get_random_string
from datetime import timedelta, datetime
class Token:
@staticmethod
def generate_token():
return get_random_string(32)
@staticmethod
def is_token_valid(token):
# 判断Token是否过期
expiration_time = timedelta(hours=1)
try:
time_created = datetime.strptime(token[:19], "%Y-%m-%d %H:%M:%S")
except ValueError:
return False
time_now = datetime.now()
if (time_now - time_created) < expiration_time:
return True
return False
在生成Token时,我们使用get_random_string()函数生成一个32位长度的随机字符串。对于Token的有效性验证,我们设置了一个过期时间为1小时,通过判断Token的创建时间与当前时间的差是否小于1小时来判断Token是否有效。
接下来,在userApp目录下的views.py文件中,编写用户登录的逻辑。可以使用以下代码实现:
from django.http import JsonResponse
from django.contrib.auth import authenticate
from userApp.tokens import Token
def 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:
token = Token.generate_token()
response = JsonResponse({'token': token})
response.set_cookie('token', token)
return response
else:
return JsonResponse({'error': 'Invalid credentials'})
在用户登录接口中,首先获取用户提交的用户名和密码,并使用Django提供的authenticate()函数进行用户身份验证。如果验证成功,就生成一个Token,并将其作为响应内容返回给用户,在响应中同时设置了一个名为'token'的Cookie,用于在后续的请求中进行Token的验证。
最后,在userApp目录下的urls.py文件中,添加用户登录接口的路由映射。示例代码如下:
from django.urls import path
from userApp.views import login
urlpatterns = [
path('login/', login, name='login'),
]
现在,可以启动Django开发服务器,使用以下命令:
python manage.py runserver
接下来,就可以通过发送POST请求到http://127.0.0.1:8000/login/来进行用户登录。可以使用curl命令或者使用Python的requests库发送请求,示例代码如下:
import requests
data = {
'username': 'testuser',
'password': 'password123'
}
response = requests.post('http://127.0.0.1:8000/login/', data=data)
print(response.json())
以上代码中,我们将用户名和密码以字典的形式放在data变量中,并通过requests库的post()函数发送POST请求。最后,我们通过response.json()获取到响应的JSON内容,并打印出来。
这样,就实现了一个基于TokenAuthentication()的用户登录系统。当用户成功登录后,会生成一个Token,并将其返回给用户,在后续的请求中,用户可以通过Cookie头部将Token传递给服务端进行验证,从而实现无需用户名和密码进行用户登录的功能。
