[Abp vNext 入坑分享] - 4.JWT受权的接入

1、感想html

在写这一系列文章以前,原本觉得写这个以前已经搭建好的框架描述会比较简单,可是慢慢写下来才发现。写这个真的不简单额,原本觉得图文一块儿,一个晚上应该能输出一篇吧。。。结果:现实真的骨感,一个星期能输出两篇都不错了。。前端

1.以前没有写过总体系列类的文章,从高考以后就基本上没有写长篇的文章了。git

2.本系列文章主要定位面向是初中级的开发能够根据步骤来搭建,高级与架构主要是相互讨论一下借鉴,因此不少东西写得很简单,基本上至关因而手把手教搭建的了github

3.虽然本身以前的搭建已经完成了,可是重新来的时候好像有一些以前没有考虑到的东西又要从新考虑一下加深了理解,从第4篇开始已经慢慢到了应用的层面,虽然基于abpvnext,可是并无彻底基于。要写这些的时候又要想着怎么写得比较清晰,或者又怕本身理解不够搞错了。docker

4.如今大多数分享都是写demo类,像这种直接拿整个解决方案的不多,同时架构这种又是不一样的team有不一样的解决方案。我只能写我本身的用法,供参考吧。。json

总知一句话:好难啊!!尽可能坚持写完整个框架搭建吧!!服务器

搞完以后看下要不要基于这个架构再开个持续集成的新坑:k8s,jenkins,docker之类的持续集成方面的。架构

唉!慢慢写吧。app

2、简要说明框架

源码:https://github.com/lcjyslqyy/AbpVnext.Learn

《章节目录》

因为咱们在前面已经说明了,弃用id4的受权方法,所以在这里须要使用原始的jwt来作受权校验。

本篇文章则是介绍JWT的接入,并根据本身的须要定义受权失败的返回,取代原来的401状态码。关于JWT的介绍,网上不少文章已经描述得很是清晰了,我这里就不作过多的赘述了,大概是:前两段是base64,谁均可以解码的,最后一段是签名用于和服务器的key和前两段组合一个New string的签名校验;想要详细了解的请跳转:https://www.jianshu.com/p/576dbf44b2ae

 

3、具体步骤

2.1 nuget在Host项目安装:Microsoft.AspNetCore.Authentication.JwtBearer 

 

 

 

 

在appsettings.json里面添加:

"JwtAuth": {

    "Audience": "abpvnextlearn",

    "Issuer": "abpvnextlearn",

    "SecurityKey": "dzehzRz9a8+8TAGbqKHP9ITdRmZdOpJWQRsFb8oz50A=",//签名的key

    "TokenTime": 48

  }

而后在LearnHttpApiHostModule注入AddAuthentication的受权服务,使用jwt校验的方式:以下图

 

 

则已经添加Jwt受权成功。

2.2校验一下是不是能够正常受权了,

咱们先增长一个LoginController,增长Logout的方法,增长Authorize属性,以下图在这里,注意一点:全部的方法都要添加方法属性:如HttpPost,HttpGet等,否则在Swagger中是会抛出异常的。

 

 

 

 

这里咱们看到swagger中有了logout的接口了,咱们请求一下,接口返回了401状态码,是未受权状态的描述。这里说明咱们的jwt的校验是添加成功的了。

 

 

 

 

2.3修改未受权的输出。咱们定义受权失败返回{code="401",msg="无登陆信息或登陆信息已失效,请从新登陆"},因为咱们后期全部的接口都遵循返回标准,code表示返回码0为成功,msg为信息,data为数据。

所以受权失败也要统一此标准,以便前端能够进行统一判断。

须要在AddJwtBearer添加如下代码:

options.Events = new JwtBearerEvents

                {

                    OnChallenge = context =>

                    {

                        //此处代码为终止.Net Core默认的返回类型和数据结果,这个很重要哦,必须

                        context.HandleResponse();

                        var payload = "{\"ret\":401,\"err\":\"无登陆信息或登陆信息已失效,请从新登陆。\"}";

                        //自定义返回的数据类型

                        context.Response.ContentType = "application/json";

                        context.Response.StatusCode = StatusCodes.Status200OK;

                        context.Response.WriteAsync(payload);

                        return Task.FromResult(0);

                    }

                };

再次请求以下图,表示咱们替换成功了。

 

 

 

 

2.4接下来完善获取jwt的请求Login,获取jwt的流程,这里我如写一些简单的逻辑。以下图:

 

 

 

而后登陆来获取token,以下图:

 

 

 

 而后使用postman来校验token是否合法:

 

返回正常,说明受权校验已经经过了。

4、下一章介绍

定义统一的返回,与全局异常处理替换掉abpvnext原来的全局异常

相关文章
相关标签/搜索