一, 感想
在写这一系列文章之前, 本来以为写这个之前已经搭建好的框架描述会比较简单, 但是慢慢写下来才发现. 写这个真的不简单额, 本来以为图文一起, 一个晚上应该能输出一篇吧... 结果: 现实真的骨感, 一个星期能输出两篇都不错了..
1. 之前没有写过整体系列类的文章, 从高考之后就基本上没有写长篇的文章了.
2. 本系列文章主要定位面向是初中级的开发可以根据步骤来搭建, 高级与架构主要是相互讨论一下借鉴, 所以很多东西写得很简单, 基本上相当于是手把手教搭建的了
3. 虽然自己之前的搭建已经完成了, 但是从新来的时候好像有一些之前没有考虑到的东西又要重新考虑一下加深了理解, 从第 4 篇开始已经慢慢到了应用的层面, 虽然基于 abpvnext, 但是并没有完全基于. 要写这些的时候又要想着怎么写得比较清晰, 或者又怕自己理解不够搞错了.
4. 现在大多数分享都是写 demo 类, 像这种直接拿整个解决方案的很少, 同时架构这种又是不同的 team 有不同的解决方案. 我只能写我自己的用法, 供参考吧..
总知一句话: 好难啊!! 尽量坚持写完整个框架搭建吧!!
搞完之后看下要不要基于这个架构再开个持续集成的新坑: k8s,jenkins,docker 之类的持续集成方面的.
唉! 慢慢写吧.
二, 简要说明
源码: https://github.com/lcjyslqyy/AbpVnext.Learn
《章节目录》
由于我们在前面已经说明了, 弃用 id4 的授权方法, 因此在这里需要使用原始的 jwt 来做授权校验.
本篇文章则是介绍 JWT 的接入, 并根据自己的需要定义授权失败的返回, 取代原来的 401 状态码. 关于 JWT 的介绍, 网上很多文章已经描述得非常清晰了, 我这里就不做过多的赘述了, 大概是: 前两段是 base64, 谁都可以解码的, 最后一段是签名用于和服务器的 key 和前两段组合一个 New string 的签名校验; 想要详细了解的请跳转: https://www.jianshu.com/p/576dbf44b2ae.
三, 具体步骤
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 是否合法:
返回正常, 说明授权校验已经通过了.
四, 下一章介绍
定义统一的返回, 与全局异常处理替换掉 abpvnext 原来的全局异常
来源: https://www.cnblogs.com/twoBcoder/p/12797427.html