淘东电商项目(70) -互联网安全架构设计(搭建开放平台-OAuth)

简介: 淘东电商项目(70) -互联网安全架构设计(搭建开放平台-OAuth)

引言

本文代码已提交至Github(版本号:7179531a807c32f1fbe15b17759063840052d161),有兴趣的同学可以下载来看看:https://github.com/ylw-github/taodong-shop

在之前博客《淘东电商项目(67) -互联网安全架构设计(方法论)》,主要讲解了互联网安全架构设计的方法,主要介绍了如下几种:

  • 基于网关实现IP黑名单与名单拦截
  • API接口实现Token授权认证
  • 使用MD5实现API接口验证签名,防止抓包篡改数据
  • 实现API接口安全加密传输(公钥和私钥互换机制)
  • 基于Oauth2.0 实现API接口开放平台
  • 接口参数使用网关实现防止XSS、SQL注入
  • 定期工具实现代码健康扫描

上面的打勾代码实现在前两篇博客已经讲解完,本文主要讲解OAuth平台及其搭建。

本文目录结构:

l____引言

l____ 1.OAuth平台的应用场景

l____ 2.为什么需要OAuth平台 ?

l____ 3.搭建OAuth平台

l________ 3.1 获取appId和appSecret

l________ 3.2 获取accessToken

l________ 3.3 获取用户信息

l____ 4.测试

1.OAuth平台的应用场景

「淘东电商项目」前几篇博客已经讲解过微信公众号开发,开发前我们都会登录微信开放平台去获取appIdappSecret,其实这里的微信公众平台就是一个OAuth平台的一个应用场景。

2.为什么需要OAuth平台?

当系统逐渐壮大后,如果有合作伙伴需要我们系统的一些资源,需要我们提供接口给他们,这个时候如果直接暴露接口是很危险的,他们可以把接口地址提供给他人,让他人直接调用。因此在合作伙伴调用我们的接口时,我们更希望知道是谁调用了我们的接口、并控制他们调用接口的次数、以及控制他们能调哪些接口等等,这个时候,我们需要OAuth平台。

下面附上一张画好的OAuth原理图:

对于上图我们可能会提出一个疑问:

为什么appId一定要与appSecret搭配?

答:appId相当于是商户id,类似于QQ号,而appSecret类似于QQ密码,appSecret可能会被黑客非法利用,所以我们在后台里,当用户发现自己的appSecret被非法利用时,可以做修改。而如果只使用appId的话(是用户号,唯一识别),那被黑客非法利用了就无法修改了,因为修改了就无法识别用户的唯一性了,微信开放平台也是这样做的。

从原理图,我们知道开放平台需要提供几个接口:

  • 获取appId和appSecret接口(用户需要提交个人信息,如:名称、身份证、营业执照等,为了方便演示,直接提供名称即可获取)
  • 根据appId和appSecret获取AccessToken接口
  • 使用AccessToken接口获取平台的信息(下面将以获取用户信息为例子)

好了,下面开始直接讲解代码。

3.搭建OAuth平台

先贴上数据库建表语句:

CREATE TABLE `app_info` (
  `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `APP_NAME` varchar(100) DEFAULT NULL COMMENT '应用名称',
  `APP_ID` varchar(200) DEFAULT NULL COMMENT '应用id',
  `APP_SECRET` varchar(255) DEFAULT NULL COMMENT '应用秘钥',
  `AVAILABILITY` varchar(255) DEFAULT NULL COMMENT '是否可用',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

3.1 获取appId和appSecret

①定义接口:

/**
 * 机构申请 获取appid 和appsecret
 *
 * @return
 */
@GetMapping("/applyAppInfo")
public BaseResponse<JSONObject> applyAppInfo(@RequestParam("appName") String appName);

②接口实现:

@Override
public BaseResponse<JSONObject> applyAppInfo(String appName) {
  // 1.验证参数
  if (StringUtils.isEmpty(appName)) {
    return setResultError("机构名称不能为空!");
  }
  // 2.生成appid和appScrec
  Guid guid = new Guid();
  String appId = guid.getAppId();
  String appScrect = guid.getAppScrect();
  // 3.添加数据库中
  AppInfo appInfo = new AppInfo();
  appInfo.setAppName(appName);
  appInfo.setAppId(appId);
  appInfo.setAppSecret(appScrect);
  int insertAppInfo = appInfoMapper.insertAppInfo(appInfo);
  if (!toDaoResult(insertAppInfo)) {
    return setResultError("申请失败!");
  }
  // 4.返回给客户端
  JSONObject data = new JSONObject();
  data.put("appId", appId);
  data.put("appScrect", appScrect);
  return setResultSuccess(data);
}

3.2 获取accessToken

①定义接口:

/*
    * 使用appid 和appsecret密钥获取AccessToken
    */
   @GetMapping("/getAccessToken")
   public BaseResponse<JSONObject> getAccessToken(@RequestParam("appId") String appId,
                                                  @RequestParam("appSecret") String appSecret);

②接口实现:

@Override
public BaseResponse<JSONObject> getAccessToken(String appId, String appSecret) {
  // 使用appid+appSecret获取AccessToken
  // 1.参数验证
  if (StringUtils.isEmpty(appId)) {
    return setResultError("appId不能为空!");
  }
  if (StringUtils.isEmpty(appSecret)) {
    return setResultError("appSecret不能为空!");
  }
  // 2.使用appId+appSecret查询数据库
  AppInfo appInfo = appInfoMapper.selectByAppInfo(appId, appSecret);
  if (appInfo == null) {
    return setResultError("appId或者是appSecret错误");
  }
  // 3.获取应用机构信息 生成accessToken
  String dbAppId = appInfo.getAppId();
  String accessToken = generateToken.createToken("auth", dbAppId);
  JSONObject data = new JSONObject();
  data.put("accessToken", accessToken);
  return setResultSuccess(data);
}

3.3 获取用户信息

①定义接口:

/*
 * 验证Token是否失效
 */
@GetMapping("/getAppInfo")
public BaseResponse<JSONObject> getAppInfo(@RequestParam("accessToken") String accessToken);

②接口实现:

@Override
public BaseResponse<JSONObject> getAppInfo(String accessToken) {
  // 1.验证参数
  if (StringUtils.isEmpty(accessToken)) {
    return setResultError("AccessToken cannot be empty ");
  }
  // 2.从redis中获取accessToken
  String appId = generateToken.getToken(accessToken);
  if (StringUtils.isEmpty(appId)) {
    return setResultError("accessToken  invalid");
  }
  // 3.使用appid查询数据库
  AppInfo appInfo = appInfoMapper.findByAppInfo(appId);
  if (appInfo == null) {
    return setResultError("AccessToken  invalid");
  }
  // 4.返回应用机构信息
  JSONObject data = new JSONObject();
  data.put("appInfo", appInfo);
  return setResultSuccess(data);
}

4.测试

1.模拟合作伙伴提交个人信息,申请appIdappSecret,浏览器访问:http://localhost:9500/applyAppInfo?appName=腾讯小马

2.获取AccessToken令牌,浏览器访问:http://localhost:9500/getAccessToken?appId=7f38d645-032a-43e7-9f08-b7740288836d&appSecret=BF81CD9C70B597F88CF7794A7961F7FD

3.通过令牌去获取信息获取商户信息,浏览器访问:http://localhost:9500/getAppInfo?accessToken=authfdc563ec2ec049ea8fc66ab777215bb5

目录
相关文章
|
9月前
|
存储 缓存 安全
某鱼电商接口架构深度剖析:从稳定性到高性能的技术密码
某鱼电商接口架构揭秘:分层解耦、安全加固、性能优化三维设计,实现200ms内响应、故障率低于0.1%。详解三层架构、多引擎存储、异步发布、WebSocket通信与全链路防护,助力开发者突破电商接口“三难”困境。
|
12月前
|
人工智能 安全 Cloud Native
Nacos 3.0 架构升级,AI 时代更安全的 Registry
随着Nacos3.0的发布,定位由“更易于构建云原生应用的动态服务发现、配置管理和服务管理平台”升级至“ 一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台 ”。
|
12月前
|
存储 设计模式 人工智能
AI Agent安全架构实战:基于LangGraph的Human-in-the-Loop系统设计​
本文深入解析Human-in-the-Loop(HIL)架构在AI Agent中的核心应用,探讨其在高风险场景下的断点控制、状态恢复与安全管控机制,并结合LangGraph的创新设计与金融交易实战案例,展示如何实现效率与安全的平衡。
1885 0
|
12月前
|
消息中间件 监控 前端开发
如何开发项目管理系统中的项目结项板块?(附架构图+流程图+代码参考)
在企业项目管理中,“项目结项”是关键环节,常因流程不清、文档不全、审批滞后等问题导致交付困难。本文介绍如何通过“项目结项”模块实现线上化管理,涵盖结项申请、审批流程、成果上传、权限控制等功能,帮助团队高效完成项目收尾,避免成果丢失与流程混乱。内容包括功能设计、业务流程、系统架构、数据库设计、核心代码实现、前端交互及优化建议,助力项目管理系统快速落地并稳定运行。
|
安全 测试技术 API
电商API接口开发:基础架构搭建全攻略
本文详细解析了电商API接口从零搭建基础架构的全流程。首先通过需求分析明确业务功能与接口规范,选定数据格式(如JSON)及通信方式(如RESTful)。接着在架构设计阶段选择合适的技术栈、数据库方案,并引入API网关实现统一管理。开发实现部分涵盖认证授权、数据访问、日志记录与异常处理等核心功能。安全防护则强调数据加密、传输安全及速率限制策略。测试优化阶段包括单元测试、集成测试、性能与安全测试,确保接口稳定性。最后通过工具生成清晰的API文档并实施版本控制,为开发者提供便利。整体流程系统化、模块化,助力打造高效、安全的电商API接口。
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
594 102
|
9月前
|
缓存 Cloud Native 中间件
《聊聊分布式》从单体到分布式:电商系统架构演进之路
本文系统阐述了电商平台从单体到分布式架构的演进历程,剖析了单体架构的局限性与分布式架构的优势,结合淘宝、京东等真实案例,深入探讨了服务拆分、数据库分片、中间件体系等关键技术实践,并总结了渐进式迁移策略与核心经验,为大型应用架构升级提供了全面参考。
|
9月前
|
存储 监控 安全
132_API部署:FastAPI与现代安全架构深度解析与LLM服务化最佳实践
在大语言模型(LLM)部署的最后一公里,API接口的设计与安全性直接决定了模型服务的可用性、稳定性与用户信任度。随着2025年LLM应用的爆炸式增长,如何构建高性能、高安全性的REST API成为开发者面临的核心挑战。FastAPI作为Python生态中最受青睐的Web框架之一,凭借其卓越的性能、强大的类型安全支持和完善的文档生成能力,已成为LLM服务化部署的首选方案。
1371 3
|
11月前
|
存储 安全 前端开发
如何开发一套EHS 健康安全环境管理系统?(附架构图+流程图+代码参考)
本文介绍如何开发一套完整的EHS(健康、安全和环境)管理系统,涵盖系统核心模块、技术架构、数据库设计、前后端开发示例及上线建议,帮助企业提升安全管理效率与合规性。
|
12月前
|
数据挖掘 项目管理 Python
如何开发项目管理系统中的项目启动板块?(附架构图+流程图+代码参考)
本文介绍了项目管理系统中“项目启动”板块的设计与实现,涵盖功能模块、业务流程、开发技巧及效果展示,并提供代码参考和常见问题解答,助力企业高效搭建项目管理平台。