聊聊常见的服务(接口)认证授权



写在前面

头发掉得多了,总有机会接触/调到各种各样的接口,各种面向Api编程实际上已经嵌入到我们的习惯中,没办法现在服务端通信还得是http(s),其他协议还未能成为通用的。

大厂的开发平台api我先不敢说,各种小公司、或者不少大公司内部之间,各种各样的的接口签名/授权方式可以说是尽显劳动人民智慧、八仙过海,各显神通。当然,我也曾是八仙中一员大将;

然而,不能总当神仙,偶尔也要做下凡人。下面我们聊聊常见的服务授权方式;

Basic Auth

Basic Auth使用base64编码把 username:password (注意中间有个半角冒号)加密后放入请求头:

比如账号密码 hei:123  , base64后在request—header这样:

Authorization: Basic aGVpOjEyMw==

Postman支持

总结:

优点:简单明了,特别容易理解;

缺点:因为简单,且几乎是明文的形式传递,总得来说不够安全;且要配合权限啊、授权策略啊要花挺多成本;

看场景使用;

Key Auth

这个别看名字起得高大上,其实也就是你先定义一个 KeyName,KeyValue,调用方和接口定义方约定这个Key放在—header或者Query Params里,到时按约定好的取出就好;

比如我定义了的

KeyName: apikey

KeyValue: hei.key.7LimLB5qXHtuBsI7HpxM9mj447ME3GlNoe7WxKL5

约定好放到Header里。

Postman支持

总结: 跟basic auth 一样,还是不够安全,虽然可以通过添加超复杂的keyValue提高安全性。但记住,只要是固定的key,永远都是不安全的。看场景使用。

Jwt Auth

这个知识点可是可是博客园的常客了,三天两头都有相关博文;但毕竟本片不是jwt专题,我就不长篇阔论了简单聊聊;

首先jwt是啥

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519),

传递信息的标准的说白了就是一种数据格式,它分成三个部分组成,中间用.隔开:

(图来自龙哥的博客)

//上图三部分一般这样组成,所以整个jwt都是base64的(除了那两个分割的'.')
base64Url(Header)+"."+base64Url(Payload)+"."+base64Url(Signature)

具体的一个jwt

eyJhbGciOiJSUzI1NiIsImtpZCI6IjY1OTMxODE4QjYxQkIzQTVEMUIxN0Y0MEVCRTlEQkY2IiwidHlwIjoiYXQrand0In0.eyJuYmYiOjE1OTcxNDIxNzgsImV4cCI6MTU5NzE0OTM3OCwiaXNzIjoiaHR0cDovLzE3Mi4xNi4zLjExNzo1MTAwIiwiYXVkIjpbIm9jZWxvdCIsImh0dHA6Ly8xNzIuMTYuMy4xMTc6NTEwMC9yZXNvdXJjZXMiXSwiY2xpZW50X2lkIjoib2NlbG90LmNsaWVudCIsImp0aSI6IkQxRkExNkE3MkM1RDY4RDEyMTMzM0RGRjRDRDBCM0Q4IiwiaWF0IjoxNTk3MTQyMTc4LCJzY29wZSI6WyJvY2Vsb3QuYWRtaW4iXX0.PCN_Q77r0IyaesLy-Q0lTV12EYD9GkywrDMfxrCBj3ac9YltW8RzczAqdn2f92iysf_5Iu6hvTm16z9MJay6-eGWBiuIgJRXaCDlTqWWKcI8rWmW17ncyJT5oIgwip54Tfder9AfJOUJ-K0U2zT0fsrnBf7CZDLmkAAFHoxky1dzmPnh7JM4EkjtC-ybLOu_Aav7GgIOyYfodovxNgMvGHdhmheJLjxpjGblfI6o3rH8fRedwoV8zCY8MxJRGVcqg8slo0E9wfsebNx8hCV1mLHJbuDbJ1DCnDQ_1I1pFEFZCVNE2g0R-LRMC7opfFcveorNvZcJ8zEPWcACqoGXZg

我们 复制到https://jwt.io/ 解析看看:

可以很清楚的看到, header部分是说明Token的类型和所使用的算法,payload部分就是授权信息,比如用户名啊、哪个服务器,什么时候发的、什么时候失效等等。signature部分是签名信息,防止篡改。

一般是怎么用jwt的

我借龙哥个图来说明下

  1. 一般我们先定义一个颁发token服务(Auth Service —Api),服务调用方携带授权信息申请token;

  2. Auth Service验证授权信息后返回jwt;

  3. 服务调用方携带jwt请求受保护接口;

  4. 受保护接口验证jwt 的有效性,验证有没有权限、是否在有效期、有没有被篡改等(这里不用到Auth Service验,也就是去中心化的方式,这是jwt的一大有点)。这里写着是网关,其实也可以写在接口的过滤器那里,不过这样每个项目都要实现一遍验证逻辑了。

  5. 这里已经解析完jwt,打扰可以携带jwt的信息去调用接口啦;

  6. 响应,流程完;

其实大家都差不多这么用的,不管是自定义实现还是用第三方的中间件形式,具体看需求;

Postman支持

总结:

优点

  • 因为json的通用性,所以JWT是可以进行跨语言支持;

  • 因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。

  • 便于传输,jwt的构成非常简单,传输字节不大,高性能。

  • 去中心化,高性能;

缺点

  • 安全性:如果是完全去中心化的方式,如果jwt给黑客截取了,是没有办法吊销的,开发的时候可以考虑下如何解决这个问题;

  • 携带的信息是完全开放的,不能携带安全性高的加密信息,只能说有限安全性,依然看场景使用,不过我的经验,日常开发绝大部分时候够用了。

Oauth2—client_credentials(客户端凭证)模式

Oauth2.0 有多种模式,比如Authorization Code、Implicit Flow、Password Grant等、我们今天只来看client_credentials—客户端配置模式吧。

我们先看官方的流程图:

可以看到非常简单,他其实只要:

A、Client携带授权信息(client_id,client_scret,scopes,grant_type等)去Authorization Server 申领AccessToken;

B、Authorization Server 颁发AccessToken;

然后你就可以用这个AccessToken 调用 受保护的接口了;

我们来看看实例:

1、先请求AccessToken

2、携带AccessToken 调用受保护接口

Postman支持

其实这里的header是这样的:

Authorization: Bearer ZJg0rak2ZYKyZeBTH7zJzDl94AjkfwiE

那可以看到我们的AccessToken ,很明显很简短,看情况是不携带任何信息的。那意味着它每次调用都需要去Authorization Server验证AccessToken 才行,这样接口调用量瞬间翻倍了,性能肯定受影响。我们能不能像上面提到的jwt一样,用jwt 做token,去中心化呢?

答案是可以的,Oauth2.0-client_credentials模式本身是对流程的标准化,并没有限制token类型,所以我们是可以用jwt做token,但是又涉及到一个问题授权是OAth2.0的活,如果你加入jwt做身份区分那其实已经是OpenId Connect的活了,那又是另一个话题了。但那其实是一个非常好的设计,我们.net core里面就用这么个方案实现的框架IdentityServer4;

总结:identityserver4真香;

Hmac Auth

Hmac的全称是Hash-based Message Authentication Code(基于哈希的消息认证码), 看起来有点蒙,我们先来看个例子,比如我们有如下的接口地址:

http://api.hei.com?userid=23233&age=18&type=normal

我们经常会这样给我们接口加签名:

  1. 先把query参数全小写后,按a-z排序为,用&隔开:age=18&type=normal&userid=23233

  2. 对参数32位小写md5, md5_32(“age=18&type=normal&userid=23233”) 得到sign:a8b8a635cc34b95a8788abfa6f6b9ff2

  3. 把sign加在请求参数后面:http://api.hei.com?userid=23233&age=18&type=normal&sign=a8b8a635cc34b95a8788abfa6f6b9ff2

  4. 服务端按同样的方法验证参数;

如果我们把以上的 md5_32(“排序参数”)加“盐”改为:md5_32(my_secret_key,“排序参数”) 这就是:

Hmac-Md5 算法,同理,还有:

Hmac-SHA1

Hmac-SHA384

Hmac-SHA256

Hmac-SHA512

等等算法,主要的区别在于哈希算法的不同。因为安全性有一定的保障,各种语言里面都会有对应的语言无关的实现,比如.net core 里面就有:HMACMD5、HMACSHA1、HMACSHA256、HMACSHA384、HMACSHA512 这五个内置类,都是调用里面的ComputeHash()。

当然,生产中的例子可能不像上面的那么简单,比如接口调用方要求一定附加一个时间戳参数在请求里,5分钟内本请求有效,my_secret_key 非常复杂,动态 my_secret_key 等等方式。

这个Postman当然支持:

这是我用网关kong内置的Hmac Auth 插件实现的。

总结:

大总结

我觉得接口认证授权这块挺多东西,我现在用IdentityServer4+Hmac比较多,大家平时怎么处理的,也可以聊一聊~

参考

https://www.cnblogs.com/edisonchou/p/talk_about_what_is_jwt.html

文章博客园地址请点击“阅读原文”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二分查找(划分时左右元素个数不相等)解析+代码

一:问题描述 当我们在用二分法查找元素的时候,我们往往特希望遇到是奇数个元素个数的数组,因为划分完左右两边的个数相等,所以在以前刚学二分法的时候就有这个疑问,当时就是模模糊糊过去了,再遇到其实还是会有疑问。现…

网络计算机室电源线怎么布,网吧综合布线(电源和网络)经验谈

电源系统布线篇网吧目前所提供的服务,像网页浏览、网络游戏、在线电影、远程教育等最基本的服务都与网络有关,网络质量的好坏直接决定了网吧的生存能力。所以,如何规划一个优质的网络环境,是网吧经营者必须要考虑的一个要点&#…

69. Sqrt(x)010(二分法求解+详解注释)

一:题目 ‘给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0…

计算机网络 哪个教材好,学习计算机网络哪本教材最好?

benxiuxian高分答主12-29TA获得超过8057个赞地理期末复习计划临近期末,为帮助学生理顺知识,培养学生灵活运用知识分析问题,解决问题的能力,形成完整的知识体系,特作复习计划如下:一、复习目的:1…

安装VSCode作为常用的文本编辑器

作为程序员,跟文本编辑器打交道那是天天都在做的事情,一个趁手的文本编辑器能大大地提供工作效率,减少996福报。笔者使用过各种文本编辑器,或是xx版,或是免费版,多多少少都有一些不便之处,如今 …

35. 搜索插入位置011(二分查找)

一:题目: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], …

计算机学科的三大科学形态,华中科技大学 计算机科学与技术方法论 3计算学科中的三个学科形态.ppt...

华中科技大学 计算机科学与技术方法论 3计算学科中的三个学科形态第3章 计算学科中的三个学科形态 文坤梅 E-Mail:kunmei.wen 智能与分布计算实验室 Intelligence and Distributed Computing Lab 设计形态与抽象、理论两个形态存在的联系 设计源于工程,用于系统或设…

利用 Github Actions 自动更新 docfx 文档

利用 Github Actions 自动更新 docfx 文档Introdocfx 是微软出品一个 .NET API 文档框架,有一个理念是代码即文档,会根据项目代码自动生成 API 文档,即使没有写任何注释也会生成 API 文档,也有一些默认的主题可以配置,…

34. 在排序数组中查找元素的第一个和最后一个位置012(二分查找+思路+详解+两种方法)Come Baby!!!!!!!! !

一:题目 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 进阶: 你可以设计并实现时间复杂度为 O(log n) 的算法解…

计算机专业可以报考放射医学吗吗,文科生可以报考医学影像技术专业吗

近期很多文科同学都在疑惑可不可以报考医学影像技术专业,这里有途网小编告诉大家,医学影像技术专业是理科专业,文科生一般来说是不可以报考医学影像技术专业的,但在每年高校招生计划发布的时候也可能会考虑招收文科生的情况&#…

基于PaaS平台的多应用自集成方案之公共数据集成

源宝导读:在明源云“天际”PaaS平台之上,可以构建、部署和运行多个业务应用,并支持多应用分离部署,以提升系统整体的性能和稳定性。本文将介绍多应用自集成解决方案以及相关的实现细节。一、背景1.1、业务场景在明源云“天际”Paa…

vector容器中查找某一元素是否存在(牛逼的vector!!!!!!)

一:前言 当你想要快速查找某一元素是否存在,可以调用该方法 二:步骤 1.写迭代器:vector ::iterator t; 2.调用find方法:t find(v.begin(),v.end(),查找的元素); 3.和v.end()进行比较,如果找…

HTML和css重要的知识点,html 和 css 基础知识点(一)(示例代码)

伪类选择器:伪类是直接在元素后面加“:”,例如a:hover,可直接在css中用而不用在html中像类一样定义,因为是浏览器预先设定好的。a一般顺序是:a:link{} 未访问状态链接a:visited{}已访问状态链接a:hover{}鼠标悬停上时状态还有其他伪类,如first-child对应第一个子元素…

可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践

写在前面为了不违反广告法,我竭尽全力,不过“最佳实践”确是标题党无疑,如果硬要说的话 只能是个人最佳实践。问题引出可能很多新手都会遇到同样的问题:我要我的Asp.net Core 应用传统方式直接部署(host),…

33. 搜索旋转排序数组(013)二分查找+思路详解+来干了这杯代码!!!!!!

一&#xff1a;题目 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], n…

计算机软件在矿井地质中的应用,(完整版)遥感导论知识点整理(梅安新版)

遥感导论知识点整理【题型】一、选择题二、填空题三、名词解释四、简答题五、论述题注意&#xff1a;标注页码的地方比较难理解&#xff0c;希望大家多看看书&#xff0c;看看ppt。【第一章】绪论1、【名】遥感(remote sensing)广义&#xff1a;泛指一切无接触的远距离探测&…

C#实践设计模式原则SOLID

理论跟实践的关系&#xff0c;说远不远&#xff0c;说近不近。能不能把理论用到实践上&#xff0c;还真不好说。通常讲到设计模式&#xff0c;一个最通用的原则是SOLID&#xff1a;S - Single Responsibility Principle&#xff0c;单一责任原则O - Open Closed Principle&…

81. 搜索旋转排序数组 II(014)二分查找+思路+详解+二种做法

一&#xff1a;题目 已知存在一个按非降序排列的整数数组 nums &#xff0c;数组中的值不必互不相同。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转 &#xff0c;使数组变为 [nums[k], nums[k1…

学校考的计算机三级证书,全国计算机等级考试证书用途

全国计算机等级考试证书用途计算机知识浩如瀚海&#xff0c;即使任何资深人士都不可能精通或熟悉所有的计算机软件&#xff0c;但是为什么他们无论什么软件都能很快就上手会用呢&#xff0c;那是因为本质上任何计算机软件都是C语言之类的编程语言开发出来的&#xff0c;所以我们…

10-4 6-4 查询厂商“D“生产的PC和便携式电脑的平均价格 (10 分)思路+详解+测试用例

前言&#xff1a;测试用表 贴心杰将这个测试表分享给大家 &#xff0c;如果大家做题的时候发现那个点过不去&#xff0c;一定不要直接看别人的博客&#xff0c;先自己测试用例&#xff0c;如果思路也对 &#xff0c;验证数据也对&#xff0c;还有错误 你再看看别人的思路&…