首页 > 其他分享 >ninja-authenticate的文章

ninja-authenticate的文章

时间:2023-07-02 15:01:34浏览次数:57  
标签:info authenticate return get token user 文章 ninja payload

从drf切换到django-ninja。

drf是一个传统以model驱动的rest框架,可以对一个模型进行CURD。但fastapi给了我一个提示,现代后端系统不完全是一个rest标准,不是把model当成资源这么简单,会涉及到缓存、nosql,分布式等等。传统rest api应用起来挺麻烦。

django-ninja与fastapi“长得”几乎一样,就是受fastapi启发,但可以与django原生生成整合到一起,即可以获得django的orm, admin的优势,同时还可以获得fastapi的异步,swagger,pydantic的数据校验能力。

 

 

api本身就是一个json_response,对一个dict字典结构进行序列化后返回的过程。ninja类似fastapi做了入参与出参自动解析与校验的工作,可以省下我们一些工作量,另外就是swagger的界面整合,还是router路由等。

当然api工作本身有一个权限与认证的过程,这个相对更加重要。现在前后端分离不可能使用session-auth,这个基本不用了,主要是jwt的token认证机制。

今天我们主要搞搞基本django-ninja的jwt机制。

from ninja.security import HttpBearer


class AuthBearer(HttpBearer):
    def authenticate(self, request, token):
        if token == "supersecret":
            return token

header里需要带 Authorization字段, Bearer TOKEN。

curl -X 'GET' \
  'http://127.0.0.1:8000/api/common/test_auth' \
  -H 'accept: */*' \
  -H 'Authorization: Bearer aaa'

这个HttpBearer是会从header里取出Authorization后面的TOKEN。

这里的auth可以是任意可执行的函数,比如校验ip的黑白名单等。还有api key的场景,无论是在query key,header里或者cookie里,ninja都有一些支持,其实自己实现也不复杂。

https://github.com/jmwri/simplejwt

simplejwt封装了encode, decode功能。

from datetime import datetime

from simplejwt.jwt import Jwt, decode

SECRET_KEY = '123456'
# token 有效时间 时 分 秒
TOKEN_LIFETIME = 12 * 60 * 60


class JwtUtils:
    @staticmethod
    def get_token(payload):
        time_now = int(datetime.now().timestamp())
        valid_to = time_now + TOKEN_LIFETIME
        jwt = Jwt(secret=SECRET_KEY, payload=payload, valid_to=valid_to)
        return jwt.encode()

    @staticmethod
    def get_payload(token):
        return decode(SECRET_KEY, token)[1]


    @staticmethod
    def is_timeout(payload):
        time_now = int(datetime.now().timestamp())
        if payload['exp'] < time_now:
            return True
        else:
            return False


if __name__ == '__main__':
    token = JwtUtils.get_token({'username': 'admin'})
    print(token)
    payload = JwtUtils.get_payload(token)
    print(payload)
    print(JwtUtils.is_timeout(payload))

本质上,就是把一个字典进行加密,使用同一个SECRET_KEY可以对数据进行解密,取出数据。

使用如下AuthBearer可以给任意一个api请求做jwt校验,token是自动获取的,其实就是从header里的meta取出authorization里的token。然后写自己的检验逻辑即可。若返回False就是一个401的错误。

class AuthBearer(HttpBearer):
    def authenticate(self, request, token):
        payload = JwtUtils.get_payload(token)
        username = payload.get('username')
        print(username)
        # if username == 'admin':
        #    return False
        return True

校验成功之后,类似session机制,需要拿到current_user对象,session验证是把对象保存在session里,而jwt模式下,可以从token里解出user_info。

@router.get("/test_auth", auth=AuthBearer())
def bearer(request):
    user_info = get_user_info_from_token(request)
    return {'message': 'test_auth正常使用', 'user_info': user_info}

get_user_info_form_token的代码如下:

def get_user_info_from_token(request):
    token = request.META.get("HTTP_AUTHORIZATION")
    token = token.split(" ")[1]
    user_info = JwtUtils.get_payload(token)
    return user_info

其实框架只是把一些例行性的功能做了封装。

在熟悉机制之后用比较好,省不少模板代码。但从学习的角度,还是自己从更基础的代码开始实现会更好掌握。

小结:

前后端分享django+ ninja是个不错的选择。

标签:info,authenticate,return,get,token,user,文章,ninja,payload
From: https://www.cnblogs.com/lxgbky/p/17520801.html

相关文章

  • 第一篇文章用作测试用
    Markdown语法模式测试开始写123很多事情都不是应该这么做对吧错题本可以开始写到个人网站上来了不是吧错误做事typeSpanstruct{TraceIDint64//用于标示一次完整的请求idNamestringIDint64//当前这次调用span_idParentID......
  • 文章发布审核——同步调用与异步调用
    同步:就是在发出一个调用时,在没有得到结果之前,该调用就不返回(实时处理)异步:调用在发出之后,这个调用就直接返回了,没有返回结果(分时处理)发布文章——》异步调用——》审核文章异步线程的方式审核文章 SpringBoot集成异步线程调用:①:在自动审核的方法上加上@Async注解(标明要异步......
  • django优缺点 # ninja的优点可替代DRF
    摘抄:https://www.cnblogs.com/fnng/p/16084825.htmldjango优点通过脚手架创建项目/应用:不用考虑项目架构怎么设计。自带Admin后台:在没有前端的情况下,可以比较方便通过Admin对数据进行操作。自带常用模块:一个命令就能生成group、user、session...表,一般个系统都需要user表吧......
  • 文章
    SP7579YOKOF-PowerCalculusP9286[ROI2018]ExtractionofradiumBLINNET-BytelandianBlingorsNetworkSUBLEX-LexicographicalSubstringSearch维护集合两元素最大乘积......
  • 一篇文章搞懂NIO效率高的原理
    NIO相比BIO的优势NIO(Non-blockingI/O,在Java领域,也称为NewI/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。bio与nio面向流与面向缓冲JavaNIO和BIO之间第一个最大的区别是,BIO是面向流......
  • 一篇文章搞懂NIO效率高的原理
    NIO相比BIO的优势NIO(Non-blockingI/O,在Java领域,也称为NewI/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。   bio与nio面向流与面向缓冲JavaNIO和BIO......
  • 一篇文章搞懂网络IO
    IO是Input/Output的缩写。Unix网络编程中有五种IO模型:blockingIO(阻塞IO)nonblockingIO(非阻塞IO)IOmultiplexing(多路复用IO)signaldrivenIO(信号驱动IO)asynchronousIO(异步IO)背景java.io包基于流模型实现,提供File抽象、输入输出流等IO的功能。交互方式是同步、阻塞的方式,在读取输入......
  • 一篇文章搞懂网络IO
    IO是Input/Output的缩写。Unix网络编程中有五种IO模型:blockingIO(阻塞IO)nonblockingIO(非阻塞IO)IOmultiplexing(多路复用IO)signaldrivenIO(信号驱动IO)asynchronousIO(异步IO)背景java.io包基于流模型实现,提供File抽象、输入输出流等IO的功能。交互方式是同......
  • 自媒体文章审核单元测试
    packagecom.heima.wemedia.test.service;importcom.heima.wemedia.WemediaApplication;importcom.heima.wemedia.service.WmNewsAutoScanService;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autow......
  • 5第五章 自媒体文章发布
    #第五章自媒体文章发布目标完成自媒体文章列表查询功能完成自媒体文章的发布功能完成自媒体文章的查询完成自媒体文章的删除功能完成自媒体文章的上下架功能功能1自媒体文章列表查询1.1需求分析1.2表结构和实体类wm_news自媒体文章表自媒体文章实体类packag......