Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊常见的服务(接口)认证授权

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

作者头像
乔达摩@嘿
发布于 2020-09-11 08:11:49
发布于 2020-09-11 08:11:49
1.5K00
代码可运行
举报
文章被收录于专栏:嘿dotNet嘿dotNet
运行总次数:0
代码可运行

写在前面

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

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

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

Basic Auth

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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),

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

(图来自龙哥的博客

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//上图三部分一般这样组成,所以整个jwt都是base64的(除了那两个分割的'.')
base64Url(Header)+"."+base64Url(Payload)+"."+base64Url(Signature)

具体的一个jwt

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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--客户端配置模式吧。

我们先看官方的流程图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     +---------+                                  +---------------+
     |         |                                  |               |
     |         |>--(A)- Client Authentication --->| Authorization |
     | Client  |                                  |     Server    |
     |         |<--(B)---- Access Token ---------<|               |
     |         |                                  |               |
     +---------+                                  +---------------+

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

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

B、Authorization Server 颁发AccessToken;

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

我们来看看实例:

1、先请求AccessToken

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

Postman支持

其实这里的header是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊微服务架构中的认证鉴权那些事
应用系统绕不开基础的鉴权,微服务架构推荐使用 HTTP 的方式进行服务间通信,这里推荐一篇介绍 HTTP 认证鉴的文章。
aoho求索
2021/11/25
3.3K0
聊聊微服务架构中的认证鉴权那些事
聊聊统一认证中的四种安全认证协议(干货分享)
   在开发的过程中,常常听说认证(Authentication)和授权(Authorization),它们的缩写都为auth,所以非常容易混淆。
陈哈哈
2023/11/01
3.8K0
聊聊统一认证中的四种安全认证协议(干货分享)
微服务统一认证与授权的 Go 语言实现(上)
各位读者朋友鼠年大吉,祝各位新的一年身体健康,万事如意! 最近疫情严重,是一个特殊时期,大家一定要注意防护。很多省份推迟了企业开工的时间,大部分的互联网公司也都是下周开始远程办公。大家可以利用在家的
aoho求索
2020/02/25
3.6K0
认证鉴权也可以如此简单—使用API网关保护你的API安全
随着企业数字化进程的发展,企业正在大量使用 API 来连接服务和传输数据,API 在带来巨大便利的同时也带来了新的安全问题,被攻击的 API 可能导致重要数据泄漏并对企业业务造成毁灭性影响。因此,API 安全正受到业界和学术界的广泛关注。
克莱尔小熊
2021/12/26
10.7K2
认证鉴权也可以如此简单—使用API网关保护你的API安全
常见登录认证 DEMO
basic auth 是最简单的一种,将用户名和密码通过 form 表单提交的方式在 Http 的 Authorization 字段设置好并发送给后端验证
JS菌
2019/07/30
2.9K0
微服务[学成在线] day16:基于Spring Security Oauth2开发认证服务
要想掌握学生的学习情况就需要知道用户的身份信息,记录哪个用户在什么时间学习什么课程;如果用户要购买课程也需要知道用户的身份信息。所以,去管理学生的学习过程最基本的要实现用户的身份认证。
LCyee
2020/08/05
4.3K0
微服务[学成在线] day16:基于Spring Security Oauth2开发认证服务
SpringBoot整合JWT认证机制实现接口鉴权
session登录的认证方案是看,用户从客户端传递用户名和密码登录信息,服务端认证后将信息储存在session中,将session_id放入cookie中,以后访问其他页面,服务器都会带着cookie,服务端会自动从cookie中获取session_id,在从session中获取认证信息。
泰坦HW
2020/07/22
3.7K0
SpringBoot整合JWT认证机制实现接口鉴权
第三方 API 接口安全加密方法和认证
与第三方系统做系统对接,接口认证是必不可少的,安全的认证方式可以极大的增强系统的安全性访问。
小柒2012
2023/04/04
8770
第三方 API 接口安全加密方法和认证
浅谈一下前后端鉴权方式 ^.^
虽然本人现在从事前端开发,但是之前一直是 PHP 全栈,所以对前后端鉴权机制也有一定的了解,就找些资料简单记录一下吧。(瞎掰扯~)
老猫-Leo
2023/12/11
5250
浅谈一下前后端鉴权方式 ^.^
前端需知道的常见登录鉴权方案
说起鉴权大家应该都很熟悉,不过作为前端开发来讲,鉴权的流程大头都在后端小哥那边,本文的目的就是为了让大家了解一下常见的鉴权的方式和原理。
coder_koala
2020/11/10
2.8K0
前端需知道的常见登录鉴权方案
客官,来看看AspNetCore的身份验证吧
本文附带了普通Bearer JwtToken验证和微信小程序验证登录的源代码,效果图您可以参考下方的Gif图片。
句幽
2020/07/01
1.5K0
客官,来看看AspNetCore的身份验证吧
JWT & SpringBoot & 授权
JSON WEB TOKEN,它定义了一种紧凑且自包含的方式,用于将信息作为 JSON 对象安全地在各方之间传输信息。此信息可以验证和信任,因为它是数字签名。JWT 可以使用密钥(使用HMAC算法)或使用 RSA 或 ECDSA 进行公钥/私钥对进行签名。
收心
2022/01/17
1.4K0
JWT & SpringBoot & 授权
Postman授权与Cookie设置
很多时候,出于安全考虑我们的接口并不希望对外公开。这个时候就需要使用授权(Authorization)机制 授权过程验证您是否具有访问服务器所需数据的权限。当您发送请求时,您通常必须包含参数,以确保请求具有访问和返回所需数据的权限。Postman提供授权类型,可以轻松地在Postman本地应用程序中处理身份验证协议。
清风穆云
2021/08/09
2.6K0
认证授权的设计与实现
每个网站,小到一个H5页面,必有一个登录认证授权模块,常见的认证授权方式有哪些呢?又该如何实现呢?下面我们将来讲解SSO、OAuth等相关知识,并在实践中的应用姿势。
ruochen
2021/11/25
1.3K0
我在调用第三方和为第三方提供接口时的流程及常见问题的解决方案
最近在忙和第三方厂商的接口对接,正好趁热打铁,梳理下我在调用第三方和为第三方提供接口时的流程及常见问题的解决方案,事不宜迟,我们直接开始!
才浅Coding攻略
2023/11/14
3.1K0
我在调用第三方和为第三方提供接口时的流程及常见问题的解决方案
聊一聊接口测试如何处理鉴权
在接口测试中,鉴权(Authorization)是验证请求方是否有权限访问特定资源的关键步骤。鉴权主要是验证用户是否有权限访问某个接口,确保安全性,因为很多接口都需要验证用户的身份和权限,否则会有安全风险。
漫谈测试
2025/04/29
1370
聊一聊接口测试如何处理鉴权
聊聊统一身份认证服务
当企业的应用系统逐渐增多后,每个系统单独管理各自的用户数据容易形成信息孤岛,分散的用户管理模式阻碍了企业应用向平台化演进。当企业的业务发展到一定规模,构建统一的标准化账户管理体系将是必不可少的,因为它是企业云平台的重要基础设施,能够为平台带来统一的帐号管理、身份认证、用户授权等基础能力,为企业带来诸如跨系统单点登录、第三方授权登录等基础能力,为构建开放平台和业务生态提供了必要条件。
我思故我在
2020/02/14
5.4K0
聊聊统一身份认证服务
Jwt服务间认证
新进部门项目的小伙伴经常会问一些关于Jwt权限认证的问题,结合项目架构以及网络资料,分享一些关于我们系统对Jwt的使用情况
3号攻城狮
2018/06/18
4.8K0
Jwt服务间认证
JWT
JWT官网 JSON Web Token (JWT) 是一个通过JSON形式作为WEB应用的令牌,用于在各方之间以 JSON 对象的形式安全传输信息。在传输过程中可以完成数据加密、签名等操作。 以下是JWT使用的一些场景:
十玖八柒
2022/08/01
1.3K0
JWT
前端网络高级篇(二)身份认证
网络身份的验证的场景非常普遍,比如用户登陆后才有权限访问某些页面或接口。而HTTP通信是无状态的,无法记录用户的登陆状态,那么,如何做身份验证呢?
娜姐
2020/09/22
1.4K0
前端网络高级篇(二)身份认证
相关推荐
聊聊微服务架构中的认证鉴权那些事
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档