认证与授权,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.验证

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Blazor是一种基于WebAssembly的新型Web开发框架,可以使用C#语言开发客户端应用程序。它提供了一种方便的方式来实现JWT认证授权。 在Blazor应用程序中,您可以使用ASP.NET Core Identity和JSON Web Token(JWT)来实现JWT认证授权。首先,您需要在ASP.NET Core应用程序中配置JWT认证服务。然后,您可以使用Identity提供的API来管理用户和角色,以及实现基于角色的授权策略。 接下来,您需要在Blazor组件中使用`[Authorize]`属性来标记需要授权才能访问的组件。这将要求用户登录,并检查他们是否具有访问该组件的权限。 最后,您可以使用JWT来验证用户身份,并根据用户的角色和权限来授权访问。 下面是一个示例,演示如何在Blazor应用程序中使用JWT认证授权: ``` @page "/myprotectedpage" @attribute [Authorize(Roles = "Admin")] <h1>Welcome to the protected page!</h1> @code { [Inject] private IAccessTokenProvider TokenProvider { get; set; } private async Task<string> GetAccessTokenAsync() { var tokenResult = await TokenProvider.RequestAccessToken(); if (tokenResult.TryGetToken(out var token)) { return token.Value; } else { return null; } } protected override async Task OnInitializedAsync() { var accessToken = await GetAccessTokenAsync(); if (accessToken != null) { // Verify the token and extract the user's claims var handler = new JwtSecurityTokenHandler(); var token = handler.ReadJwtToken(accessToken); var userId = token.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value; var roles = token.Claims.Where(c => c.Type == ClaimTypes.Role).Select(c => c.Value).ToList(); // Check if the user has the required role if (!roles.Contains("Admin")) { NavigationManager.NavigateTo("/accessdenied"); } } else { NavigationManager.NavigateTo("/login"); } } } ``` 在上面的示例中,我们使用`[Authorize(Roles = "Admin")]`属性来标记需要“Admin”角色才能访问的组件。然后,我们使用`IAccessTokenProvider`来获取JWT访问令牌,并验证令牌以确定用户的身份和角色。如果用户没有所需的角色,我们将重定向到一个名为“accessdenied”的页面。 希望这个示例能够帮助您实现Blazor中的JWT认证授权

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chuntian_tester

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值