编写开放接口与思考

news2024/11/14 16:32:04

编写开放接口与思考

一、情景描述:

当一个项目开发一定程度时,会有跟合作厂商对接共同开发的情况,那么如果合作厂商想要使用你项目中的某个接口,你该如何把接口暴露给他们?

二、实现方式分析

1、因为现在接口大部分都需要携带token才能访问的,直接让这个接口免token访问是一种方式,也是最简单的方式,但是风险性太高,免token就相当于所有人都能够调用这个接口,不安全不推荐;

2、如果我们想要提供接口供别人调用,首先我们可以模仿市面上已有的提供对外接口的方式,站在巨人的肩膀上,让你更快一步

像市面上大部分的开放平台,都会提供很多开放的接口

  • 微信公众号
    在这里插入图片描述
  • 海康威视开放平台
    在这里插入图片描述
  • 京东支付开放平台在这里插入图片描述
    可以发现,这些开放平台都有一个共同的特点
    提供的接口参数都需要像公钥,签名这样的加密参数进行校验,这些参数一般都是开放平台提供

也就不难猜出,如果要提供一个开放接口,在业务逻辑之上,要添加身份认证校验的功能
在这里插入图片描述

三、实现设计

结合已有的提供接口的方式,下面我来编写一个开放接口demo供大家参考

设计思路:

1、提供给调用者参数:appid,appkey
appid:身份id
appkey:公钥
解释:appid作为识别用户的标识,appkey公钥用来进行加密算法运算生成验证签名

2、加密规则:使用appid和appkey公钥+实时时间戳生成sign签名
3、使用方式:调用者使用appid和appkey公钥通过加密算法生成sign签名,然后把appid,sign,timestamp作为请求头来调用接口
timestamp:时间戳,如果超过范围则不允许调用接口
注意
1、既然要验证身份,那么创建身份也是需要由接口提供方来实现的;
2、创建好的身份信息建议入库保存;
3、为了保证时效性,添加timestamp参数;
只有三个参数都验证通过了,才能走接口业务代码

实现思路

1、验证appid

查询参数appid在数据库中是否存在,如果不存在则验证失败,如果存在则进入下一步

2、验证sign

查询参数sign是否满足自己要求的加密算法方式,如果不满足则sign比对不一致,如果满足则验签成功进入下一步

3、验证timestamp

查询timestamp是否在当前十分钟有效期内(时间要求可自定义),如果不满足则超时退出,满足则可进入业务层

四、代码实现

demo结构如下
在这里插入图片描述
controller层

@Slf4j
@RequestMapping("hello")
@RestController
public class HelloController {
    private static final long  diffMile = 900000;//15*60*1000毫秒=15分钟内有效
    @Value("${appsecret}")
    private String  appsecret;
    @Value("${appid}")
    private String  appid;
    @RequestMapping("/oneInterface")
    public Result oneInterface(HttpServletRequest request) {

        Result ret = new Result();
        String timestamp = request.getHeader("timestamp");
        String checkappid = request.getHeader("appid");
        String sign = request.getHeader("sign");
        if (checkappid == null || timestamp == null || sign == null) {
            log.info("请求参数缺少");
            return ret.fail("请求参数缺少");
        }
        if (!appid.equals(checkappid)) {//校验appid
            log.info("请求appid不正确");
            return ret.fail("请求appid不正确");
        }
        long nowTime = System.currentTimeMillis();
        long reqTime;
        try {
            reqTime = Long.parseLong(timestamp);
        } catch (Exception e) {
            log.info("时间戳转换异常", e);
            return ret.fail("时间戳转换异常");
        }
        if (Math.abs(nowTime - reqTime) > diffMile ) {//差值绝对值大于区间
            log.info("与服务器时间相差超过15分钟");
            return ret.fail("与服务器时间相差超过15分钟");
        }
        //校验签名
        String checksign = MD5Util.MD5Encode(appid.concat(appsecret).concat(timestamp), "UTF-8");
        if (!sign.equals(checksign)) {
            log.info("签名不正确");
            return ret.fail("签名不正确");
        }
        log.info("校验成功");

        //业务逻辑
        return ret.ok("接口调用成功");
    }
}

加密工具类

package com.windwoo.utils;

import java.security.MessageDigest;


public class MD5Util {

    private static String byteArrayToHexString(byte b[]) {
        StringBuffer resultSb = new StringBuffer();
        for (int i = 0; i < b.length; i++)
            resultSb.append(byteToHexString(b[i]));

        return resultSb.toString();
    }


    private static String byteToHexString(byte b) {
        int n = b;
        if (n < 0)
            n += 256;
        int d1 = n / 16;
        int d2 = n % 16;
        return hexDigits[d1] + hexDigits[d2];
    }


    public static String MD5Encode(String origin, String charsetname) {
        String resultString = null;
        try {
            resultString = new String(origin);
            MessageDigest md = MessageDigest.getInstance("MD5");
            if (charsetname == null || "".equals(charsetname))
                resultString = byteArrayToHexString(md.digest(resultString
                        .getBytes()));
            else
                resultString = byteArrayToHexString(md.digest(resultString
                        .getBytes(charsetname)));
        } catch (Exception exception) {
        }
        return resultString;
    }

    private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
        "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
}

上述代码使用的加密方式是对称加密,也就是提供者和使用者密钥appsecret是一样的

接口调试
在这里插入图片描述

在编写好接口后,还需要告诉调用者生成签名的方式,demo中实现方式是将appid,appsecret,timestamp字符串进行拼接然后md5加密

String sign = MD5Util.MD5Encode(appid.concat(appsecret).concat(timestamp), "UTF-8");

五、总结:

以上便是自定义开放接口全部步骤,当然校验的方式也有很多种,加密方式也有很多种,像对称加密,非对称加密,信息摘要,数字签名等,不同的加密算法对应着不同的应用场景,大家可以选择适合的方式来调整

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2057832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超融合/分布式 IT 架构有哪些常见故障类型?如何针对性解决和预防?

本文刊于《中国金融电脑》2024 年第 7 期。 作者&#xff1a;SmartX 金融团队 以超融合为代表的分布式 IT 基础架构凭借其高性能、高可靠和灵活的扩展能力&#xff0c;在满足大规模、高并发、低延迟业务需求等方面展现出显著优势&#xff0c;成为众多金融机构构建 IT 基础设施…

Nginx: 体系化知识点梳理

概述 我们需要对 Nginx 要有体系化的一个认识对 Nginx 自身来说&#xff0c;它是作为一个中间件的&#xff0c;只要是中间件&#xff0c;它必然会涉及到前端和后端对于 Nginx 来说&#xff0c;它是需要协调整个前后端的一个组件那对于中间件来&#xff0c;我们要理解整个外部系…

Python 设置Excel工作表页边距、纸张大小/方向、打印区域、缩放比例

在使用Excel进行数据分析或报告制作时&#xff0c;页面设置是确保最终输出效果专业、美观的关键步骤。合理的页面设置不仅能够优化打印效果&#xff0c;还能提升数据的可读性。本文将详细介绍如何使用Python操作Excel中的各项页面设置功能。 目录 Python 设置Excel工作表页边…

Hexo通过GitHub设置自定义域名

本身GitHub也是支持自定义域名的&#xff0c;本次教程将讲解如何使用GitHub自带的自定义域名解析。 1. GitHub设置 1.1 登录GitHub账号 登录GitHub账号&#xff0c;找到名称为 用户名.github.io的仓库&#xff0c;并点击进入。 1.2 进入Settings页面 点击如图的Settings按…

Mysql的相关编程基础知识

一. 配置MySQL 首先下载mysql-5.0.96-winx64&#xff0c;安装过程如下图所示。 1.安装MySQL 5.0 ​ ​ 2.选择手动配置、服务类型、通用多功能型和安装路径 ​ 3.设置数据库访问量连接数为15、端口为3306&#xff08;代码中设置URL用到&#xff09;、编码方式为utf-8 ​ 4.设…

【C语言】冒泡排序保姆级教学

C语言冒泡排序保姆级教学 直奔主题&#xff1a; 拿排升序举例子 第一步&#xff1a; 将想要排序的数组中数值最大的那个数排到该数组的最后 具体实现如下图&#xff1a; 第一步代码实现 for (int i 1; i < n ; i)//n为数组大小此处为4 {if (a[i - 1] > a[i])//注意越…

k8s综合项目

一、准备环境 1.1 部署服务器 在centos7.9系统里搭建v1.23版本的k8s集群&#xff0c;准备四台服务器&#xff0c;两台作为master&#xff0c;主机名分别为 k8s-master和k8s-master-2&#xff0c;主机名为k8s-master&#xff0c;两台作为 node&#xff0c;主机名分别为k8s-nod…

嵌入式开发输出调试信息的常用方法

嵌入式开发为什么需要输出调试信息&#xff1f; 稳严文&#xff1a;因为输出调试信息是嵌入式开发中一项非常重要的实践&#xff0c;它有助于保证软件的可靠性、稳定性和性能&#xff0c;也是故障排查的关键工具之一。 白话文&#xff1a;程序猿想知道自己敲的代码是否正确、是…

Nginx反向代理功能

反向代理&#xff1a;reverse proxy&#xff0c;指的是代理外网用户的请求到内部的指定的服务器&#xff0c;并将数据返回给用户的 一种方式&#xff0c;这是用的比较多的一种方式。 Nginx 除了可以在企业提供高性能的web服务之外&#xff0c;另外还可以将 nginx 本身不具备的…

如何选择最佳路线?

交通线路的选择 日常交通线路的选择&#xff0c;并不是按最短路径选择的。还要参考道路的等级&#xff0c;道路是否拥堵&#xff0c;道路通行速度等多种情形。本程序列举出所有能通行的线路&#xff0c;并计算出行驶距离&#xff0c;来供用户选择。当然&#xff0c;也可以加入…

linux | ubuntu虚拟机创建硬盘、磁盘分区、分区挂载、自动挂载、磁盘清理

点击上方"蓝字"关注我们 01、创建硬盘 >>> 什么使硬盘? 点击虚拟机设置,这里有两个硬盘,一个100G,一个20G 应用场景,下载yocto时,磁盘空间不足,所以写下这篇文章,供大家参考 >>> 开始创建一个新的硬盘 点击添加 【选择硬盘 下一步】 【推…

三、Vuex是什么?Vuex详解

什么是Vuex 在理解Vuex之前&#xff0c;首先需要理解我们为什么要使用它&#xff1f;它解决了什么问题&#xff1f; 为什么要使用它 在Vue开发中&#xff0c;我们常常会用到组件直接的传值、通讯。有父子通讯&#xff0c;兄弟组件通讯…但是传参对于多层嵌套就显得非常繁琐&am…

分享思源笔记的几个骚操作

文章目录 思维导图复习法效果视频制作过程使用方法 大纲复习方法制作过程 人工智能简易使用效果制作过程 思维导图复习法 效果视频 bandicam20240817222246034.mp4 制作过程 首先下载【写味】主题或者是[自定义块样式]插件 他两个的区别是 思维导图以列表形式写出来 选择转…

计算机毕业设计选题推荐-旅游景点数据分析-Python爬虫可视化

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Unity教程(十一)使用Cinemachine添加并调整相机

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

武林外传书生版单机安装教程+GM工具+虚拟机一键端

今天给大家带来一款单机游戏的架设&#xff1a;武林外传书生版。 另外&#xff1a;本人承接各种游戏架设&#xff08;单机联网&#xff09; 本人为了学习和研究软件内含的设计思想和原理&#xff0c;带了架设教程仅供娱乐。 教程是本人亲自搭建成功的&#xff0c;绝对是完整…

快速带你玩转高性能web服务器后续

目录 一、Nginx 高级配置 1.1 Nginx 状态页 1.2 Nginx 压缩功能 1.3 Nginx的版本隐藏 1.4 Nginx 变量使用 1.4.1 内置变量 二、 Nginx Rewrite 相关功能 2.1 ngx_http_rewrite_module 模块指令 2.1.1 if 指令 2.1.2 set 指令 2.1.3 break 指令 2.1.4 return 指令 2…

cmake install setlocal错误

cmake中的代码如下&#xff1a; #设置安装目录的前缀 set(CMAKE_INSTALL_PREFIX $ENV{PUBLISH_DIR}) #这边的输出满足要求 message(STATUS "install dir:${CMAKE_INSTALL_PREFIX}") #指定安装 install(TARGETS ${TARGET_NAME} RUNTIME DESTINATION bin …

数据埋点系列总结|从基础到实践的深度总结

在当今数字化时代,数据已成为企业的核心资产,而数据驱动决策则是充分利用这一资产的关键方法。本系列文章全面探讨了从数据收集到分析,再到实际应用的整个过程,为读者提供了深入而实用的指导。让我们深入回顾这个journey,详细探讨每个主题的核心内容,并思考数据驱动决策的未来发…

SHOPLINE x TiDB丨集群成本降低 50%!跨境电商 SHOPLINE 交易、商品管理等核心业务的数据库升级之路

导读 本文整理自 TiDB 社区深圳站——SHOPLINE 数据库/TiDB 负责人车佳蔚的演讲《SHOPLINE & TiDB 在跨境电商中的应用实践》。本次分享深入探讨了 SHOPLINE 在跨境电商领域的数字化转型过程中&#xff0c;如何通过 TiDB 技术应对技术挑战&#xff0c;实现降本增效。 本文…