作为程序员一定要保持良好的睡眠,才能好编程

api 开发-Http请求服务接口规范以及加解密说明

发布时间:2018-07-18

现在非常流行api的开发,那么开发api,传递请求的时候,需要注意什么呢?

今天我们就来看一看:


首先需要知道,api 通过  ajax 在网络中进行传输,数据安全是非常重要的。

开发api需要解决的问题一般有哪些呢?


1、跨域问题

什么是跨域:简单的说,在两个域名不同的情况下访问资源就属跨域,这个情况在接口中最常遇见。

跨域问题这里不做过多介绍,如果需要详细了解,请访问:

if (isAjax()) {
  header('Access-Control-Allow-Methods: GET, POST');
  header('Access-Control-Allow-Headers: X-Requested-With, Uni-Source, X-Access-Token');
 
  $origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '*';
  if (ENVIRONMENT !== 'development') { //检查跨域列表
    $this->isCors($origin) || $origin = NULL;
  }
 
  if ($origin) {
    header('Access-Control-Allow-Origin: ' . $origin);
    $origin === '*' || header('Access-Control-Allow-Credentials: true'); //withCredentials
  }
 
  if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    header('Access-Control-Max-Age: 86400');
 
    die;
  }
}
 
 
function isAjax($method = NULL) {
  return ($method ? $_SERVER['REQUEST_METHOD'] === strtoupper($method) : TRUE)
    && (
    isset($_SERVER['HTTP_ORIGIN'], $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']) //OPTIONS
    || isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest' //JQuery
    || isset($_SERVER['HTTP_ACCEPT']) && strpos(strtolower($_SERVER['HTTP_ACCEPT']), 'application/json') !== FALSE //axios
    || isset($_GET[VAR_PREFIX . 'ajax']) //URL
    );
}

//其实核心代码是这里:
header('Access-Control-Max-Age: 86400');
header('Access-Control-Allow-Origin: *');  //如果只是允许一个域名,可以指定域名
header('Access-Control-Allow-Methods: GET, POST');
header('Access-Control-Allow-Headers: Uni-Source, X-Access-Token');

通过上边的设置就能跨域请求了。


2、传递header头


简单请求:

同时满足以下需求,则为简单需求

访问方法仅限于:post get  head 中的一种

访问携带的header头必须是:Accept 、Accept-Language、Content-Language、Last-Event-Id、Content-type 这几个header头


Content-type:application/x-www-urlcoded、text/plain 、multipart/form-data


同时满足以上这两种需求,则为简单需求。


但是


但是这无法满足我们日常的业务需求,因此必须添加header头上添加我们自己业务的需求,

比如说:Content-tpye:application/json;charset=utf-8

修改了header头的值

再比如说,添加一个header头

x-access-token= AES 加密后的字符串、RSA非对称加密的字符串、DES加密字符串


如果加上这里的一种就属于复杂请求。


复杂请求时,浏览器会自动发起 options 请求,判断是否可以访问。



非简单请求(复杂请求):


很简单,不满足上边条件的为非简单请求,为非简单请求,会发起options请求。


3、数据安全


数据传输过程中,数据安全是需要进行加减密的,那么这是如何做的呢?


AES 高级加密标准  是替代DES的一种加密方式,安全没有非对称加密 安全系数高。

DES

这两种加密方式其实都是基于 openssl 进行加减密的,可以归类为一种,属于对称加密

http://php.net/manual/zh/function.openssl-encrypt.php

http://php.net/manual/zh/function.openssl-get-cipher-methods.php


两种加密方式的说明。



RSA 非对称加密


非对称加密,需要一个公钥和私钥,那么这两种钥匙是如何生成的?请看:  公钥与钥匙生成方式



以上是加密方式的几种介绍。



现在看看系统及一些设计规范:



报文头标准:

requestheader.png


加密方式:

业务接口数据加密方式为RSA非对称加密!



通讯方式:

所有接口通讯方式使用HTTP  POST请求,请求头部携带消息规范见报文头标准。


请求体数据格式:
接口中业务数据通过http 请求POST请求传输到服务端,服务端获取httpBody中加密的请求数据,进行解析、校验、处理、结果返回。


加密展示:


示例:
加密前:
         content 中数据加密前明文JSON串:{"qianbaoId":"1021312.00","realNameStatus":"0","remark":"test"}
加密后:
         {"content":"eIhOCkGlPbU/4zVf+kozOq1uahGUEtJk1gowbkqSr/aJeQRsYBM2+AwiceEoWpkvddz6KRQPbMSnt5kopRHjwgvB6AXBlKJoswCYhJ3sT6fYVll6k9x+FVYe386gyBlK7e0YWLXdXhhUoXKj8EdheMDFUYuhvr1VhzyqGCpRW+o="}

示例代码:

非对称加密 ,公钥加密,私钥解密

//RSA-加密方法
String en = RSAEncrypt.encrypt(publicKey, "hahh就是急是范德萨发生的发生的发生发");
System.out.println(en);

//RSA-解密方法
String old = RSAEncrypt.decrypt(privateKey, en);
System.out.println(old);



------------------------------------------------------------

对称加解密 ,使用同样的key加密同样的key解密

//AES-加密
String enAes = AESEncryptionUtil.encryptData(aesKey, "3423423423423423423423423");
System.out.println(enAes);

//AES-解密
String deAes = AESEncryptionUtil.decryptData(aesKey, enAes);
System.out.println(deAes);



返回结果:

最后返回结果是 加密后的json字符串


需要先进行解密、然后  jsondecode();


得到结果。