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. python中if __name__ == '__main__'是什么?

    __name__和__main__认识 作用:一般用于测试程序的功能,if __name__ == '__main__':下面的代码会被执行,但当前.py文件被当做模块导入的时候,main下面的代码就 ...

  2. Python爬虫抓取微博评论

    第一步:引入库 import time import base64 import rsa import binascii import requests import re from PIL impo ...

  3. SpringBoot1.5.10.RELEASE项目如何在tomcat容器中运行

    一. SpringBoot内嵌容器的部署方式 SpringBoot内部默认提供内嵌的tomcat容器,所以可以直接打成jar包,丢到服务器上的任何一个目录,然后在当前目录下执行java -jar de ...

  4. .Net vs .Net Core,我改如何选择?看这一篇文章就够了

    前言 .Net目前支持构建服务器端应用程序的两种实现主要有两种,.NET Framework和.NET Core.两者共享许多相同的组件,并且您可以在两者之间共享代码.但是,两者之间存在根本差异,在我 ...

  5. java 几种锁实现

    public class SyncronizedTest { private int value = 1; private AtomicInteger value1 = new AtomicInteg ...

  6. vue 项目总结,以及对未来的理解,对性能方面的认知

    之前自己写了一个vue项目,因为没有经验,所以很多方面的提升做的不好,比如说路由.比如说ajax都没有封装,比如说业务逻辑和通用逻辑都混合在一起,导致大片大片重复的代码累积.忽悠忽悠没入门的前端感觉还 ...

  7. base64编码的图片在网页中显示

    <img @error="changeImgSrc(user)" :src="user.src" width="42" height= ...

  8. python3编写程序,根据输入的行列数值,生成相应的矩阵(其中元素为随机数)。

    代码如下: import random n = int(input("请输入行:")) m = int(input("请输入列:")) x = y = 0 wh ...

  9. TP5使用Redis处理电商秒杀

    本篇文章介绍了ThinkPHP使用Redis实现电商秒杀的处理方法,具有一定的参考价值,希望对学习ThinkPHP的朋友有帮助! TP5使用Redis处理电商秒杀 1.首先在TP5中创建抢购活动所需要 ...

  10. web安全测试--环境搭建

    本博客主要作为作者的学习笔记,请勿装载. 作为一个安全测试的入门选手,一切操作在虚拟机中进行是最保险的. 第一先下载自己喜欢的虚拟机,我的笔记本用的VirtualBox(下载地址:https://ww ...