Bearer Token 一种安全的接口认证方式

淡淡的烟草味﹌ 2023-02-12 10:29 310阅读 0赞

因为HTTP协议是开放的,可以任人调用。所以,如果接口不希望被随意调用,就需要做访问权限的控制,认证是好的用户,才允许调用API。

目前主流的访问权限控制/认证模式有以下几种:

1、Bearer Token(Token 令牌)

定义:为了验证使用者的身份,需要客户端向服务器端提供一个可靠的验证信息,称为Token,这个token通常由Json数据格式组成,通过hash散列算法生成一个字符串,所以称为Json Web Token(Json表示令牌的原始值是一个Json格式的数据,web表示是在互联网传播的,token表示令牌,简称JWT)

2、JWT的三部分

第一部分:头部

  1. {
  2. "typ" : "JWT", typ:类型)
  3. "alg" : "HS256" alg:算法,HS256表示哈希算法的mac值。SHA256/HmacSHA256SHA256表示直接加密,HmacSHA256表示用秘钥进行加密。SHA(Secure[sɪˈkjʊə(r)] Hash Algorithm [ˈælgərɪðəm],安全散列算法) HMAC(Hash Message Authentication [ɔ:ˌθentɪ'keɪʃn] Code,散列消息鉴别码))
  4. }

第二部分(Claim正文部分)

  1. {
  2. "iss" : "joe",(issuer,发布者)
  3. "exp": 1300819380,(expirationekspəˈreɪʃn] time 过期时间,毫秒数计算)
  4. "http://example.com/is_root" :true(主题)
  5. }

第三部分:签名(将上面的两个部分组合在一起+本地信息做的一个的签名(头部在前)

网络解释:签名是把header和payload(载荷)对应的json结构进行base64url编码之后得到的两个串,用英文句点号拼接起来,然后根据header里面alg指定的签名算法生成出来的。

https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-19

1,令牌的好处:避免在使用中不断的输入账号和密码,比较安全

2,如果要测试带token的接口,首先要进行登录,登录成功会有个token信息,向api接口发送请求的时候必须带上这个token,故需要做2次请求(1,登录,拿到token 2,正式对接口进行测试)

format_png

这个时候头部会多一个Authorization

format_png 1

Authorization可能在头部,也可能直接跟在请求行里面

http://www.xxx.com/ada?token=xxxxx

要么是用post请求,然后放在参数里面

format_png 2

3、Bearer Token实战

Bearer Token中的token获取方式代码实现,如下所示:

  1. String auth = ctx.getRequest().getHeader("Authorization");
  2. if (StringUtils.isNotBlank(auth) && auth.indexOf("Bearer") >= 0) {
  3. auth = auth.substring("Bearer ".length() - 1, auth.length());
  4. Object obj = param.get("param");
  5. Map<String, Object> paramOld = JSONObject.parseObject(obj.toString());
  6. paramOld.put("ticketTgt", auth.trim());
  7. param.put("param", paramOld.toString());
  8. }

过滤器中Token校验方式,代码如下所示:

  1. /**
  2. * @Classname: com.openailab.oascloud.gateway.filter.CasBearerFilter
  3. * @Description: 组装cas的bearer token 请求方式,校验tickets
  4. * @Author: chenliang
  5. * @Date: 2020/01/08
  6. */
  7. @Component
  8. public class CasBearerFilter extends ZuulFilter {
  9. private static final Logger LOGGER = LoggerFactory.getLogger(CharacterEncodeFilter.class);
  10. @Autowired
  11. private IUnifiedOpenService iUnifiedOpenService;
  12. @Override
  13. public String filterType() {
  14. return FilterConstants.PRE_TYPE;
  15. }
  16. @Override
  17. public int filterOrder() {
  18. return 100;
  19. }
  20. @Override
  21. public boolean shouldFilter() {
  22. RequestContext ctx = RequestContext.getCurrentContext();
  23. if (!ctx.sendZuulResponse()) {
  24. return false;
  25. }
  26. String uri = ctx.getRequest().getRequestURI();
  27. boolean result = (uri.indexOf("/user/tgt-login") > 0 || uri.indexOf("/cas/userinfo") > 0 || uri.indexOf("/cas/cancel") > 0 || uri.indexOf("/cas/serviceTicket") > 0 || uri.indexOf("/cas/serviceUrl") > 0);
  28. return result;
  29. }
  30. @Override
  31. public Object run() {
  32. RequestContext ctx = RequestContext.getCurrentContext();
  33. Map<String, Object> param = ParamUtil.getRequestParams(ctx);
  34. if (Objects.isNull(param.get("param"))) {
  35. ResponseUtil.resultFormat(ctx, ResponseEnum.RESPONSE_CODE_UUM_CAS_TICKETS_STATUS_LOST);
  36. return null;
  37. }
  38. //查看是否有ticketTgt属性
  39. String map = (String) param.get("param");
  40. JSONObject paramJson = JSONObject.parseObject(map);
  41. if (Objects.isNull(paramJson.get("ticketTgt"))) {
  42. ResponseUtil.resultFormat(ctx, ResponseEnum.RESPONSE_CODE_UUM_CAS_TICKETS_STATUS_LOST);
  43. return null;
  44. }
  45. RequestParameter requestParameter = new RequestParameter();
  46. requestParameter.setMethodname(UumMethodNameConst.USER_CAS_TICKETS_STATUS);
  47. requestParameter.setParam(map);
  48. ResponseResult responseResult = iUnifiedOpenService.checkTicketStatus(requestParameter);
  49. if (responseResult != null && ResponseEnum.RESPONSE_CODE_SUCCESS.getCode() == responseResult.getCode()) {
  50. return null;
  51. } else {
  52. ResponseUtil.resultFormat(ctx, ResponseEnum.RESPONSE_CODE_UUM_CAS_TICKETS_STATUS_LOST);
  53. return null;
  54. }
  55. }
  56. }

4、注意点:

1)token一般有时间限制。测试前需要跟开发确认token可以用多久,什么时候算token失效

2)token放在哪儿,怎么传回去,需要有开发文档,或者咨询开发,登录成功返回的token需要了解从什么地方获取(可以通过录制进行查看)

Bearer Token 接口认证方式介绍完成。

发表评论

表情:
评论列表 (有 0 条评论,310人围观)

还没有评论,来说两句吧...

相关阅读

    相关 保证接口数据安全10方式

    我们日常开发中,如何保证接口数据的安全性呢?个人觉得,接口数据安全的保证过程,主要体现在这几个方面:一个就是数据传输过程中的安全,还有就是数据到达服务端,如何识别数据,最后一点

    相关 RESTful接口安全认证实例

    RESTful接口        互联网发展至今,催生出了很多丰富多彩的应用,极大地调动了人们对这些应用的使用热情。但同时也为互联网应用带来了严峻的考验。具体体现在以下几个方