1.需求:现在A公司与B公司进行合作,B公司需要调用A公司开放的外网接口获取数据,如何保证外网开放接口的安全性?

2,使用令牌方式

比如支付宝对外提供支付的接口,爱乐生公司需要调用支付宝的接口。在爱乐生调用支付宝接口的时候,支付宝进行过滤器拦截,查看参数中的accessToken信息,是否能在redis缓存中的找到对应的公司,且同时对对方开放。如果没问题,则可以调用接口。

令牌的设计方式一般会设计到以下几个参数:

App_Name       表示机构名称

App_ID          应用id

App_Secret      应用密钥  (可更改)

Is_flag           是否可用 (是否对某个机构开放)

access_token  上一次access_token

3,生成accessToken 的接口:

package com.zfb.api.controller;

import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import com.zfb.base.Response;
import com.zfb.entity.AppEntity;
import com.zfb.mapper.AppMapper;
import com.zfb.response.IndexResponse;
import com.zfb.utils.BaseRedisService; @Controller
public class Index extends Response { @Autowired
private BaseRedisService baseRedisService;
@Autowired
private AppMapper appMapper; private static final long TIMEOUT = 60 * 60 * 60; @RequestMapping("/index")
@ResponseBody
private String index() {
return "index";
} @RequestMapping("/postAccessToken")
@ResponseBody
private String postAccessToken() {
AppEntity appEntity = new AppEntity();
appEntity.setAppId("1QA2was");//不可变
appEntity.setAppName("aiyusheng");
appEntity.setAppSecret("ssss");
appEntity.setId(1);
appEntity.setIsFlag(0);
getAccessToken(appEntity);
return "index";
}
/**
* 访问获取accessToken appid+appsecret 1,如果找这个机构,说明无权访问 2,如果if_flag为1,说明接口关闭了
* 3,如果找到这个机构,且为0的话,开始生成access_token 3.1,redis 缓存中先删除之前的access_oken
* 3.2,创建新的access_token,同时放入到缓存中
*
* @return
*/ @RequestMapping("/getAccessToken")
@ResponseBody
private String getAccessToken(AppEntity appEntity) {
AppEntity findApp = appMapper.findApp(appEntity);
// 如果找到这个机构,且为0的话,开始生成access_token
IndexResponse response = firstCheck(new IndexResponse(), findApp);
if (response.getRtnCode() != 200) {
return "fail";
}
String accessToken = findApp.getAccessToken();
baseRedisService.delKey(accessToken);
String generateAccessToken = generateAccessToken(findApp.getAppId(), findApp.getAppSecret());
//更新mysql 数据库
appMapper.updateAccessToken(generateAccessToken, appEntity.getAppId());
return "success";
} public String generateAccessToken(String appid, String appSecret) {
String accessToken = UUID.randomUUID().toString() + "_" + appid + "_" + appSecret;
baseRedisService.setString(accessToken, appid, TIMEOUT);
return accessToken;
} public IndexResponse firstCheck(IndexResponse indexResponse, AppEntity findApp) {
if (findApp == null) {
indexResponse.setResultError("没有对应的机构");
return null;
}
if (findApp.getIsFlag() != 0) {
indexResponse.setResultError("没有对" + findApp.getAppName() + "开放");
return indexResponse;
}
// 查询成功
indexResponse.setRtnCode(200);
return indexResponse;
} }

过滤器:

package com.zfb.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import com.zfb.utils.BaseRedisService; @WebFilter(filterName = "tokenAccessFilter", urlPatterns = "/pay/*")
public class TokenAccessFilter implements Filter { @Autowired
private BaseRedisService baseRedisService; public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
String accessToken = request.getParameter("accessToken");
if (!StringUtils.isEmpty(accessToken)) {
//redis 里面的key 是 accessToken value是appid
String appid = (String) baseRedisService.getString(accessToken);
// 代表没有过期
if (!StringUtils.isEmpty(appid)) {
chain.doFilter(request, response);
}
} } public void destroy() { } }

API开放平台接口设计-------令牌方式的更多相关文章

  1. API开放平台接口设计-------基于OAuth2.0协议方式

    1,简介OAuth http://www.ruanyifeng.com/blog/2019/04/oauth_design.html OAuth 是什么? http://www.ruanyifeng. ...

  2. Spring Cloud 微服务开放平台接口

    github源码地址:https://github.com/spring-cloud/spring-cloud-security 前言: 什么是开放平台接口 场景 : 总公司与子公司 对接接口  还有 ...

  3. 运用百度开放平台接口根据ip地址获取位置

    使用百度开放平台接口根据ip地址获取位置 今天无意间发现在百度开放平台接口,就把一段代码拿了下来,有需要的可以试试看:http://opendata.baidu.com/api.php?query=5 ...

  4. .NET 微信开放平台接口(接收短信、发送短信)

    .NET 微信开放平台接口(接收短信.发送短信) 前两天做个项目用到了微信api功能.项目完成后经过整理封装如下微信操作类. 以下功能的实现需要开发者已有微信的公众平台账号,并且开发模式已开启.接口配 ...

  5. phonegap与微信开放平台接口整合

    在开发phonegap应用的过程中有个需求需要将应用的消息推送到微信上.于是我自己写了一个微信的phonegap插件,并成功整合进了应用. 插件地址:https://github.com/ajccom ...

  6. 云极知客开放平台接口调用方法(C#)

    云极知客为企业提供基于SAAS的智能问答服务.支持企业个性化知识库的快速导入,借助语义模型的理解和分析,使企业客户立即就拥有本行业的24小时客服小专家.其SAAS模式实现零成本投入下的实时客服数据的可 ...

  7. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(二)RESTful API实战笔记(接口设计及Java后端实现)

    写在前面的话 原计划这部分代码的更新也是上传到ssm-demo仓库中,因为如下原因并没有这么做: 有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项目太多,结构多少有些乱糟糟的. 而且这次 ...

  8. RESTful API实战笔记(接口设计及Java后端实现)

    写在前面的话 原计划这部分代码的更新也是上传到ssm-demo仓库中,因为如下原因并没有这么做: 有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项目太多,结构多少有些乱糟糟的. 而且这次 ...

  9. API开放平台基于accessToken实现

    A企业和B企业要进行合作时,A要开放api接口给B调用,这时候A可以采用基于accessToken的方式实现开放api接口 数据库表设计 B调用方式 B企业调用接口前先获取accessToken ht ...

随机推荐

  1. LeetCode 162.Find Peak Element(M)(P)

    题目: A peak element is an element that is greater than its neighbors. Given an input array where num[ ...

  2. Java基础--Java基本数据类型

    一.基本数据类型(primitive type) (1)数值型 1.数值型包括整数类型(byte,short,int,long) a.byte :1字节=8bit位   (-128~127) 包装类: ...

  3. 学习使用Guava Cache

    官方文档:https://github.com/google/guava/wiki/CachesExplained 目录 一.guava cache介绍 二.快速入门 2.1.引入依赖 2.2.第一个 ...

  4. spring boot 调度任务

    1.引入spring boot所依赖的jar包  <parent> <groupId>org.springframework.boot</groupId> < ...

  5. javascript设计模式和开发实践(阶段一)

    1,设计模式的作用:让人们写出可复用和可维护性高的程序,代价可能是,额外增加代码量: 比较形象的例子:空房间里面放东西,如果日复一日的往里面扔东西,时间久了,很难找到自己想要的东西,调整也不容易,但是 ...

  6. JavaScript入门进阶(二)

    JavaScript进阶入门(二) 转换为数字 使用parseInt() parseInt函数会先查看位置0处的字符,如果该位置不是有效数字,则将返回NaN,如果0处的字符是数字,则将查看位置1处的字 ...

  7. 基于VR三维全景的虚拟展馆展览实现

    VR三维全景虚拟现实技术的应用,能够通过全方位互动式来还原真实场景,令人产生一种身临其境的感觉,由于三维全景虚拟现实技术具有一定应用优势,其在企业与院校展示.建筑规划展示.酒店宾馆展示等方面都逐步得到 ...

  8. video标签加载视频有声音却黑屏

    问题 昨天用户上传了一个视频文件,然而发现虽然有声音但是黑屏. 解释 因为原视频的编码是用 mp4v 格式的,它需要专用的解码器.而 chrome 并不支持,所以无法播放. 然后如果用转码功能转成用 ...

  9. 基于RabbitMQ和Swoole实现的一个完整的异步任务系统

    从最开始的使用redis实现的单进程消费的异步任务系统到加入swoole的多进程消费模式,现在,我们的异步任务系统终于又能迈进一步. 因为有了前面两个简单系统的经验,这回基于RabbitMQ的异步任务 ...

  10. 动态高度计算 height window.addEventListener('resize', () => {

    created() { window.addEventListener('resize', () => { }) },