微服务之间调用的安全认证

在微服务的架构下,我们的系统根据业务被拆分成了多个职责单一的微服务,每个 API 提供给别的服务调用, 安全性是如何保证的呢?

一、了解 JWT

JWT 全称是 JSON WEB Token,是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准。JWT 的声明一般被用来在身份提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。

在实际应用中的场景常常是这样的:用户把用户名和密码发送给认证服务器(在微服务的架构下,可能会把认证作为一个模块单独抽取出来),服务器校验用户名和密码,若校验成功,服务器便会产生并返回一个 Token,用户之后便可以通过此 Token 访问服务器上受保护的资源。

Token 不仅仅是在 web 页面和认证服务器之间如此使用,在微服务之间调用时也是如此,只不过它是被缓存起来或者存到了数据库(Redis)。因为每次调用接口时都去做一次认证会大大降低系统性能,token 可以设置过期时间,而没有必要每次都去重新申请,所以一般的解决办法是采用定时器刷新 token 的做法,如果做过微信公众号的后台,你会深有体会。

实际的 Token 是这样的,它被 两个. 分为了三部分:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9 . eyJ1c2VySWQiOiJiYTVhMzA0NWRhM2MxMzkxMDI3ZWM0M2E4Njk3ODYyOWI1YzFmZDc0NTQ4MDM4ZmM3NWE2MGRlNDlmOWEwMWUyIiwicm9sZUlkIjoiNCIsImp0aSI6IjBjMGRhNjUyLTBmN2QtNDgwZi05ZjYzLWYxMDVhOTI5NzU4NSIsImlhdCI6MTU3NTUxMjYwNCwiZXhwIjoxNTc1NTE2MjA0fQ . lb1bEvVX-5rt2L-mzcQMHZtLcoqEZ_fqHbopP8ub34VGGcgNxIpE_bx4JDgSUR4PYjgiBgIBaKEbAbPUFHxTzw

  1. 第一部分称为头部(Header),它包含的信息通常是 Token 的类型和使用的签名算法,比如{ "alg": "SHA256", "typ": "JWT" }
  2. 第二部分称为消息体,也称载荷(Payload),它包含的信息可以是任何你需要的信息,比如用户的 ID ,{ "id": "1325463", "name": "小王"}
  3. 第三部分称为签名(Signature),它主要是为了防止 Token 被篡改,保证数据的安全性

二、JWT 的应用

JWT 是一种开放性的标准,所以几乎所有语言、框架都有 JWT 的工具包,比如你在使用 SpringBoot 开发时, 它的依赖可以为:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.7.0</version>
</dependency>

如果你使用了 Node 开发,需要 npm install jsonwebtoken

"dependencies": {
    "jsonwebtoken": "^8.5.1"
 }

添加新评论