认证与授权,JWT 认证

1. 认证:

        获取权限的方式

2. 授权:

        通过认证后可以获取哪些特权

3. drf中的认证授权方式:

        3.1 默认使用SessionAuthentication,会话认证,AllowAny,授权所有

         3.2 在全局配置文件settings.py文件中的REST_FRAMEWORK={}指定该配置类

# 指定drf中能用的各种解析器,渲染器,过滤引擎,搜索引擎,排序引擎,分页引擎等
REST_FRAMEWORK = {
    # 指定使用的认证类
    # a. 在全局指定的认证类(认证方式)
    'DEFAULT_AUTHENTICATION_CLASSES': [
        # 指定为session会话认证
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication'
    ],
    # 指定使用的权限类
    # a. 在全局指定的默认权限类(当认证通过后,可以获取何种权限)
    'DEFAULT_PERMISSION_CLASSES': [
        # AllowAny 不管是否认证成功,都能获取所有权限
        # IsAdminUser 管理员具备所有权限
        # IsAuthenticated 只要登录,就具备所有权限
        # IsAuthenticatedOrReadOnly 如果登录类就具备所有权限,否则只有读取权限
        'rest_framework.permissions.AllowAny',
    ],
}

        3.3 指定权限类: AllowAny--->IsAuthenticated

         3.4 前端访问: 提示身份认证信息未提供.

 4.使用DRF中的认证授权登录

        4.1 查看restframework/urls.py中的登录/等处接口路由

        4.2 将restframework/urls.py指定为项目的一个子路由

        4.3 使用drf自带的登录登场子应用

                django.contrib.auth指定认证子应用

         4.4 页面查看

 5. 注册添加superuser超级管理员用户

        5.1 python manage.py createsuperuser

        根据提示没有auth_user表,是因为没有做对应的数据迁移 

         5.2 数据迁移

# 1.创建迁移脚本(所有)
python manage.py makemigrations
# 2.执行迁移脚本(所有)
python manage.py migrate

        5.3 创建超级用户
                python manage.py createsuperuser 

        5.4 查看数据库中是否创建成功

        5.5 前端登录

                能正常查看数据了

        5.6 查看请求中的sessionid认证 

 6. JWT认证:Json Web Token认证

        6.1 最常用的认证方式:

                6.1.1 Session认证

                        6.1.1.1 保存在服务端,会增加服务端开销

                session_key会保存在服务端,有可能是保存在mysql,有可能是保存在redis,服务端会把这个session_key发送给浏览器客户端,下次来自客户端的请求就会带上这个session_key,服务端校验这个key是否存在,并且是否过期,以判断是否认证通过.         

                        6.1.1.2 分布式架构中,难以维持Session会话同步

                        6.1.1.3 会增加CSRF(Cross-site request forgery)跨站请求伪造)攻击风险

                6.1.2 Token认证

                        6.1.2.1 保存在客户端

                        6.1.2.2 跨语言,跨平台

                        6.1.2.3 扩展性强

                        6.1.2.4 鉴权性高

        6.2 token组成的3部分

                token示例:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImNodW50aWFuIiwiYWdlIjo0fQ.RMrtCAaCx36YpaQ-kFltBG5fOd1MMXXSh4tezA0NcMI

                token由3部分组成: header+playload+signature

               6.2.1 header 

                        声明类型

                        声明加密算法,默认为HS256

                        base64加密,可以解密

                6.2.2 payload 

                        存放过期时间,签发用户等

                        可以添加用户的非敏感信息

                        base64加密,可以解密

                6.2.3 signature

                        由3部分组层: 使用base64加密后的header+ . + 使用base64加密后的payload+ 使

                        用HS256算法加密,同时secret加盐处理.

        6.3 python使用第三方模块pyjwt实现token加解密

                6.3.1 安装pyjwt模块

                        pip3 install pyjwt

                6.3.2 token生成             

                6.3.3 token解密

                6.4 djangorestframework-jwt使用

                        6.4.1 安装

                                pip3 install djangorestframework-jwt

                        6.4.2 查看drf-jwt提供的token路由

                                obtain_jwt_token: 生成获取token

                                refresh_jwt_token: 刷新token

                                verify_jwt_token: 校验token

                        6.4.3 全局路由表中注册路由obtain_jwt_token

                        6.4.4 settings.py中配置

                        查看django生成token时使用到的随机生成的secret_key

                6.4.5 前端检验jwt是否生效

  • 由于JSON Web Token不再维护,故不使用。

 若提示JWT导入错误,那么就需要使用官方提供的simpleJWT认证

1.pip install djangorestframework-simplejwt

2.配置

# settings.py
INSTALLED_APPS = [
	...
    'rest_framework',               # add
    'rest_framework_simplejwt',     # add
]

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
}
SIMPLE_JWT = {
    # token有效时长(返回的 access 有效时长)
    'ACCESS_TOKEN_LIFETIME': datetime.timedelta(seconds=3600),
    # token刷新的有效时间(返回的 refresh 有效时长)
    'REFRESH_TOKEN_LIFETIME': datetime.timedelta(seconds=20),
}

 3.配置路由

4.验证


版权声明:本文为qq_40132294原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。