前言

撸码需谨慎,裸奔有风险。经常在一些技术交流群中了解到,还有很多小伙伴的项目中Api接口没有做任何安全机制验证,直接就裸奔了,对于一些临时项目或是个人小项目还好,其余的话,建议小伙伴们酌情考虑都加上,毕竟接口安全这事可大可小。

通常会采用session、cookie、jwt、ids4等方式进行接口安全认证或授权,这里就先拿jwt说事,ids4知识点比较多,后续单独整理整理;对于session和cookie的方式就留给小伙伴们研究吧,因为最近接触或是和朋友聊到的项目中,使用的不多,所以就不单独拿出来细说了。

正文

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。---官网翻译

主要用于系统中授权认证,使得在数据交换过程中通过Token方式进行校验,相对比较安全;而Token包含三部分,每部分用点(.)进行拼接,内容结构为:Header.Payload.Signature

  • Header(头)

    一个Json对象,通过Base64URL算法将其转换为一个字符串。里面有两个属性,alg和typ分别代表签名算法和生成token的类型。

  • Payload(负载)

    一个Json对象,通过Base64URL算法将其转换为一个字符串。里面默认有一些官方定义的信息,也可以将自定义信息加入到其中,但是由于不是加密的,强烈不介意将敏感信息放在其中。默认属性大概如下:

iss (issuer):签发人

exp (expiration time):过期时间

sub (subject):主题

aud (audience):接受方

nbf (Not Before):生效时间

iat (Issued At):签发时间

jti (JWT ID):唯一编号

  • Signature(签名)

    这个是对前两部分的内容进行签名,需要一个秘钥,再通过Header中指定的签名算法生成签名。比如指定算法为HMACSHA256时,生成的签名为:

收,理论知识就先提及这么多,如果需要详细了解的,可以进管网(https://jwt.io/introduction)瞅瞅,英文版怕怕?别啊,翻译工具那么多,应该难不倒小伙伴。接下来就通过代码演示方式说说jwt使用方式及涉及到的相关知识点吧。

这里还是在上一篇文章的例子上进行举例演示(跟我一起学.NetCore之Swagger让前后端不再烦恼及界面自定义),不是偷懒,而是利用Swagger方便测试,另外就是针对认证对Swagger进行一个小知识点的扩展。

以上Swagger内容不是必须,如果小伙伴不想用Swagger进行测试,直接使用类似于Postman的工具也是可以的,测试方式不冲突,所以小伙伴们别跑,咱们继续往下看↓↓↓

使用组件的经典三步走:安装包->注册组件->注册中间件;jwt集成使用如下:

通过以上简单三步操作,已经将Jwt集成到项目中,接下来开始用它来保护我们的Api接口:

如上,通过简单的在接口上增加[Authorize]特性就能保护起来啦,现在只能带“身份证”才能玩了,那系统中得有一个颁发"身份证"的地方,供系统识别验证,一般都会将其放在登录接口的地方,当用户验证成功之后,就生成对应的Token给客户端,客户端拿着这个Token就可以当“身份证”来调用接口啦,看如下代码:

这个错误应该是刚开始经常遇到的,必须要求密钥是大于等于16个字符,否则就会失败。修改密钥长度如下:

然后运行,重新登录获取Token,如下图:

可以看到,上面代码中的公共信息部分应该提取到公共配置信息中,不然要改几个地方,所以在程序开发过程中,小伙伴么尽量不要硬编码,不然就等于给自己找维护工作。

Token已经生成了,那怎么用?现在Swagger不支持输入Token,可以使用postman类似的工具进行接口测试,如下:

输入Token,成功获取信息:

Token的使用本质其实是在Header中增加了一个Authorization头,如下图:

Authorization中的值为Bearer+' '+Token,中间一定要有一个空格。同理,前端调用API接口的时候也是在请求头中增加Authorization即可。

拿到Token,就可以访问受保护的API了,现在应该了解一下生成的Token是否和刚开始说的理论一样,同时可以通过jwt官网进行解析查看具体内容:

通过官网解析看看内容:

通过上面得知,没有经过业务加密的Token,是可以进行解析的,所以不建议把一些敏感信息放在Payload中。但是对于认证来说是安全,因为校验签名是需要密钥的,而密钥是存在服务器端,一般人肯定是不知道的。

对于Token的过期,有一个点,即过期滑动时间,如果不设置,默认是五分钟,即当设置Token有效期到期时,不会马上失效,而是再过五分钟才失效,如下例:

过了几分钟后还是没有过期,如下:

过六分之后,再访问,发现Token才失效,如果觉得过期滑动时间不满足需求,可以进行设置,如下:

这里运行效果就不截图了,小伙伴试试吧!!! 这里关于Jwt的集成先说这么多,肯定是没有说完的,还有权限验证那块,单独整理一篇说吧,内容也不少。

Swagger小扩展

既然都用到Swagger,肯定是希望在Swagger上直接测试,来来来,继续往下看看↓↓↓

在注册Swagger组件时进行相关配置:

运行结果如下:

点击小锁,弹出框可进行Token输入:

输入Token授权之后就可以调用保护的接口,可以很方便的进行测试,这里就不截图演示了,小伙伴们动手试试吧。

附加知识点:

由于SecurityRequirementsOperationFilter默认将securitySchemaName 设置为"oauth2",所以在Swagger中加入描述的时候需要指定第一个参数为"oauth2",源码如下:

也可以换成其他方式,参照实现的方式2,两种方式差不多,如下图:

注意点:

  • 生成Token时的密钥大于或等于16个字符;

  • 生成的Token中默认不加密,敏感信息不要放入其中,如果有需要,可以将Token进行加密;

  • Token传输如果是外网,建议用Https,防止中途被拦截;

  • Token防止泄露,可以将有效期设置短一点;

总结

关于权限的验证单独再整理一篇分享,这里就先到这吧;旅游或回家的小伙伴们应该都回到自己的住处了吧,好好休息休息,又要开始撸码啦。

一个被程序搞丑的帅小伙,关注"Code综艺圈",识别关注跟我一起学~~~

撸文不易,莫要白瞟,三连走起~~~~

跟我一起学.NetCore之WebApi接口裸奔有风险(Jwt)相关推荐

  1. jwt 长度_跟我一起学.NetCore之WebApi接口裸奔有风险(Jwt)

    前言 撸码需谨慎,裸奔有风险.经常在一些技术交流群中了解到,还有很多小伙伴的项目中Api接口没有做任何安全机制验证,直接就裸奔了,对于一些临时项目或是个人小项目还好,其余的话,建议小伙伴们酌情考虑都加 ...

  2. 公司接口裸奔10年了,有必要用API接口签名验证吗?

    点击上方"阿拉奇学Java",选择"置顶或者星标" 每天早晨00点00分,与你相约! 往日回顾:微信支付的架构到底有多牛? 接口安全问题 请求身份是否合法? 请 ...

  3. 拒绝接口裸奔!开放API接口签名验证!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:r6d.cn/kChH 接口安全问题 请求身份是否合 ...

  4. andpods授权码订单号分享_不要再让你的接口裸奔了,Boot快速尝试OAuth2密码和授权码模式...

    微服务火热,前后端分离,oauth2 是我们接口调用认证的首选.springboot 天然集成 oauth2,使用非常方便,简单记录下,尝尝鲜. 一.啥是OAuth2 OAuth(开放授权)是一个开放 ...

  5. 跟我一起学.NetCore之熟悉的接口权限验证不能少(Jwt)

    前言 权限管控对于一个系统来说是非常重要的,最熟悉不过的是菜单权限和数据权限,上一节通过Jwt实现了认证,接下来用它实现接口权限的验证,为什么不是菜单权限呢?对于前后端分离而言,称其为接口权限感觉比较 ...

  6. 跟我一起学.NetCore之MVC过滤器,这篇看完走路可以仰着头走

    前言 MVC过滤器在之前Asp.Net的时候就已经广泛使用啦,不管是面试还是工作,总有一个考点或是需求涉及到,可以毫不疑问的说,这个技术点是非常重要的: 在之前参与的面试中,得知很多小伙伴只知道有一两 ...

  7. 跟我一起学.NetCore之Options实例演示及分析

    前言 来啦!来啦!上一节一堆代码,是不是感觉甚是无味啊?没关系,这里结合上一节内容专注举例演示,绝不废话!走起~~~~~ 正文 老规矩,一个WebApi项目走起,项目结构如下: 上一节中提到,Opti ...

  8. 跟我一起学.NetCore之选项(Options)核心类型简介

    前言 .NetCore中提供的选项框架,我把其理解为配置组,主要是将服务中可供配置的项提取出来,封装成一个类型:从而服务可根据应用场景进行相关配置项的设置来满足需求,其中使用了依赖注入的形式,使得更加 ...

  9. 一、netcore跨平台之 Linux上部署netcore和webapi

    文章目录 一.netcore跨平台之 Linux上部署netcore和webapi 第一步,你得先创建一个netcore的接口,这个我就简单创建一个接口 第二步,你得准备一个linux服务器,然后安装 ...

最新文章

  1. 在纸上写好一个c语言程序后,上机运行的基本步骤为,c基本概念(选择题).docx
  2. 惠普搜客户机t5740升级硬盘_惠普暗影精灵5首测重磅来袭:更多选择 更强性能...
  3. 1040B. Shashlik Cooking
  4. tensorflow tfrecoder read write
  5. leetcode - 688. “马”在棋盘上的概率
  6. poj 2421 ConstructingRoads 最小生成树 Prim、Kruskal
  7. 2021辽宁高考成绩查询公布,2021辽宁高考成绩什么时候出
  8. 剑指 Offer II 117. 相似的字符串
  9. 【java设计模式】之 抽象工厂(Abstract Factory)模式
  10. 移动端学习笔记(黑马教程)-仿京东首页
  11. Vulkan入门(一)-环境配置.md
  12. 【个人作品】记之-串口日志记录工具
  13. 我是不是应该离职?盖洛普Q12测评法
  14. 空气质量等级c语言编程,关于SDS011模块(空气中pm2.5及pm10)单片机c程序实现(链接附源码)...
  15. Linux磁盘的格式化
  16. css ms是什么意思,CSS 3中-webkit-, -moz-, -o-, -ms-这些私有前缀的含义和兼容
  17. [OfficeExcel] Word+Excel邮件合并 生成多个文档
  18. 10 怎么写USB驱动,Cadence USB 2.0 Controller和PHY IP驱动移植
  19. vm运行自己编译的linux,Virtualbox运行 自编译的Linux
  20. 计算机基础知识试题doc

热门文章

  1. iptables (2) 基本配置
  2. kdbchk: the amount of space used is not equal to block size
  3. [再寄小读者之数学篇](2014-11-14 矩阵的应用: 多项式)
  4. 多比Web 3D展示(3D机房/3D监控)中间件多比Web 3D展示(3D机房/3D监控)中间件免费下载购买地址...
  5. git - svn 平滑到 git
  6. 带有控制按钮的图片滚动
  7. 优秀编程网站收录集锦
  8. js javaScript array 取指定元素索引、判断是否相同、重复、过滤数据
  9. NHibernate学习笔记(二):one-to-one关系映射
  10. Haproxy安装与配置