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

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

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

响应,流程完;

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

Postman支持

1597144560719

总结:

优点

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

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

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

去中心化,高性能;

缺点

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

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

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

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

我们先看:

+---------+ +---------------+ | | | | | |>--(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

1597145029833

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

Postman支持

1597145106803

其实这里的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(基于哈希的消息认证码), 看起来有点蒙,我们先来看个例子,比如我们有如下的接口地址:

?userid=23233&age=18&type=normal

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

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

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

把sign加在请求参数后面:?userid=23233&age=18&type=normal&sign=a8b8a635cc34b95a8788abfa6f6b9ff2

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

如果我们把以上的 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()。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspwwj.html