欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2023/12/18 编程问答 85 豆豆
生活随笔 收集整理的这篇文章主要介绍了 微服务之间调用的安全认证-jwt 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

在微服务架构下,如何保证服务与服务之间调用的安全性呢?不是说你想调用就可以调用,一定要有认证机制,即只有我们内部服务发出的请求,才可以调用我们的接口。

什么是JWT

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

比如用在用户登录上时,基本思路就是用户提供用户名和密码给认证服务器,服务器验证用户提交信息的合法性;如果验证成功,会产生并返回一个Token,用户可以使用这个Token访问服务器上受保护的资源。

JWT由三部分构成,第一部分称为头部(Header),第二部分称为消息体(Payload),第三部分是签名(Signature)。一个JWT生成的Token格式为:

token = encodeBase64(header) + '.' + encodeBase64(payload) + '.' + encodeBase64(signature)

头部的信息通常由两部分内容组成,令牌的类型和使用的签名算法:

{ "alg": "HS256", "typ": "JWT" }

消息体中可以携带一些你需要的信息,比如用户ID。因为你得知道这个Token是哪个用户的,如下:

{ "id": "94256", "name": "DaDudu", "role": teacher }

签名是用来判断消息在传递的路上是否被篡改,从而保证数据的安全性,如下:

HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

通过这三部分就组成了我们的Json Web Token。

创建统一的认证服务

生成Token是在进行用户身份认证之后,通过用户的ID来生成一个Token,这个Token采用RSA加密的方式进行加密,Token的内容包括用户的ID和过期时间。

public static String getToken(String uid, int exp) {return Jwts.builder().setSubject(uid).setExpiration(new Date(System.currentTimeMillis() + 100060 *exp)).signWith(SignatureAlgorithm.RS512, priKey).compact(); }

检查Token则是根据调用方带来的Token检查是否为合法用户,就是对Token进行解密操作,能解密并且在有效期内表示合法,合法则返回用户ID。

public JWTResult checkToken(String token) {try {Claims claims = Jwts.parser().setSigningKey(pubKey).parseClaimsJws(token).getBody();String sub = claims.get("sub", String.class);return new JWTResult(true, sub, " 合法请求 ", ResponseCode.SUCCESS_CODE.getCode());} catch (ExpiredJwtException e) {// 在解析 JWT 字符串时,如果’过期时间字段’已经早于当前时间,// 将会抛出 ExpiredJwtException 异常,说明本次请求已经失效return new JWTResult(false, null, "token 已过期 ", ResponseCode.TOKEN_TIMEOUT_CODE.getCode());} catch (SignatureException e) {// 在解析 JWT 字符串时,如果密钥不正确,将会解析失败,抛出 SignatureException 异常,说明该 JWT 字符串是伪造的return new JWTResult(false, null, " 非法请求 ", ResponseCode.NO_AUTH_CODE.getCode()); } catch (Exception e) { return new JWTResult(false, null, " 非法请求 ", ResponseCode.NO_AUTH_CODE.getCode()); }}

刷新RSA公钥及私钥的作用是防止公钥、私钥泄露,公钥、私钥一般是写死的,不过我们可以做成配置的。集成配置管理中心后,可以对公钥、私钥进行动态修改,修改之后需要重新初始化公钥、私钥的对象信息。

服务提供方进行调用认证

服务提供方就是provider。服务消费方消费接口时,provider需要对其进行身份验证,验证通过才可以让它消费接口。

服务消费方申请Token

目前服务提供方已经开启了调用认证,这意味着如果现在直接调用接口会被拦截,所以在调用之前需要进行认证,即获取Token并将其放到请求头中与请求头一起传输才可以调用接口。

总结

以上是生活随笔为你收集整理的微服务之间调用的安全认证-jwt的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。