如何实现Python中的JWT用户认证机制?

2026-05-24 23:241阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计713个文字,预计阅读时间需要3分钟。

如何实现Python中的JWT用户认证机制?

在前后端分离的开发模式中,为什么需要用户认证呢?原因在于HTTP协议本身是不存储状态的(无状态),这意味着每次通过账号密码验证的用户,在下一次请求时,服务器已经忘记了之前的资源。也就是说,当验证一个用户时,服务器只记得验证通过,但忘记了具体是哪个用户。

在前后端分离开发时为什么需要用户认证呢?原因是由于HTTP协定是不储存状态的(stateless),这意味着当我们透过帐号密码验证一个使用者时,当下一个request请求时它就把刚刚的资料忘了。于是我们的程序就不知道谁是谁,就要再验证一次。所以为了保证系统安全,我们就需要验证用户否处于登录状态。

一、传统方式

前后端分离通过Restful API进行数据交互时,如何验证用户的登录信息及权限。在原来的项目中,使用的是最传统也是最简单的方式,前端登录,后端根据用户信息生成一个token,并保存这个token 和对应的用户id到数据库或Session中,接着把token 传给用户,存入浏览器 cookie,之后浏览器请求带上这个cookie,后端根据这个cookie值来查询用户,验证是否过期。

但这样做问题就很多,如果我们的页面出现了 XSS 漏洞,由于 cookie 可以被 JavaScript 读取,XSS 漏洞会导致用户 token 泄露,而作为后端识别用户的标识,cookie 的泄露意味着用户信息不再安全。尽管我们通过转义输出内容,使用 CDN 等可以尽量避免 XSS 注入,但谁也不能保证在大型的项目中不会出现这个问题。

如何实现Python中的JWT用户认证机制?

在设置 cookie 的时候,其实你还可以设置 github.com/GetBlimp/django-rest-framework-jwt

pip install djangorestframework-jwt

不是使用django的话,我们可以使用 pyjwt:
github.com/jpadilla/pyjwt/
使用比较方便,下边是我在应用中使用的例子:

import jwt import time # 使用 sanic 作为restful api 框架 def create_token(request): grant_type = request.json.get('grant_type') username = request.json['username'] password = request.json['password'] if grant_type == 'password': account = verify_password(username, password) elif grant_type == 'wxapp': account = verify_wxapp(username, password) if not account: return {} payload = { "iss": "gusibi.com", "iat": int(time.time()), "exp": int(time.time()) + 86400 * 7, "aud": "www.gusibi.com", "sub": account['_id'], "username": account['username'], "scopes": ['open'] } token = jwt.encode(payload, 'secret', algorithm='HS256') return True, {'access_token': token, 'account_id': account['_id']} def verify_bearer_token(token): # 如果在生成token的时候使用了aud参数,那么校验的时候也需要添加此参数 payload = jwt.decode(token, 'secret', audience='www.gusibi.com', algorithms=['HS256']) if payload: return True, token return False, token

到此这篇关于python中JWT用户认证的实现的文章就介绍到这了,更多相关python JWT用户认证内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

本文共计713个文字,预计阅读时间需要3分钟。

如何实现Python中的JWT用户认证机制?

在前后端分离的开发模式中,为什么需要用户认证呢?原因在于HTTP协议本身是不存储状态的(无状态),这意味着每次通过账号密码验证的用户,在下一次请求时,服务器已经忘记了之前的资源。也就是说,当验证一个用户时,服务器只记得验证通过,但忘记了具体是哪个用户。

在前后端分离开发时为什么需要用户认证呢?原因是由于HTTP协定是不储存状态的(stateless),这意味着当我们透过帐号密码验证一个使用者时,当下一个request请求时它就把刚刚的资料忘了。于是我们的程序就不知道谁是谁,就要再验证一次。所以为了保证系统安全,我们就需要验证用户否处于登录状态。

一、传统方式

前后端分离通过Restful API进行数据交互时,如何验证用户的登录信息及权限。在原来的项目中,使用的是最传统也是最简单的方式,前端登录,后端根据用户信息生成一个token,并保存这个token 和对应的用户id到数据库或Session中,接着把token 传给用户,存入浏览器 cookie,之后浏览器请求带上这个cookie,后端根据这个cookie值来查询用户,验证是否过期。

但这样做问题就很多,如果我们的页面出现了 XSS 漏洞,由于 cookie 可以被 JavaScript 读取,XSS 漏洞会导致用户 token 泄露,而作为后端识别用户的标识,cookie 的泄露意味着用户信息不再安全。尽管我们通过转义输出内容,使用 CDN 等可以尽量避免 XSS 注入,但谁也不能保证在大型的项目中不会出现这个问题。

如何实现Python中的JWT用户认证机制?

在设置 cookie 的时候,其实你还可以设置 github.com/GetBlimp/django-rest-framework-jwt

pip install djangorestframework-jwt

不是使用django的话,我们可以使用 pyjwt:
github.com/jpadilla/pyjwt/
使用比较方便,下边是我在应用中使用的例子:

import jwt import time # 使用 sanic 作为restful api 框架 def create_token(request): grant_type = request.json.get('grant_type') username = request.json['username'] password = request.json['password'] if grant_type == 'password': account = verify_password(username, password) elif grant_type == 'wxapp': account = verify_wxapp(username, password) if not account: return {} payload = { "iss": "gusibi.com", "iat": int(time.time()), "exp": int(time.time()) + 86400 * 7, "aud": "www.gusibi.com", "sub": account['_id'], "username": account['username'], "scopes": ['open'] } token = jwt.encode(payload, 'secret', algorithm='HS256') return True, {'access_token': token, 'account_id': account['_id']} def verify_bearer_token(token): # 如果在生成token的时候使用了aud参数,那么校验的时候也需要添加此参数 payload = jwt.decode(token, 'secret', audience='www.gusibi.com', algorithms=['HS256']) if payload: return True, token return False, token

到此这篇关于python中JWT用户认证的实现的文章就介绍到这了,更多相关python JWT用户认证内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!