首页 > 编程语言 >php 的 api 接口

php 的 api 接口

时间:2023-04-09 14:33:34浏览次数:30  
标签:arr randomStr timeStamp 接口 api str signature curl php

在实际工作中,使用 PHP 写 api 接口是经常做的,PHP 写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml 和 json, 在这个过程中,服务器并不知道,请求的来源是什么,有可能是别人非法调用我们的接口,获取数据,因此就要使用安全验证。


验证原理


示意图

php 的 api 接口_随机数


原理

从图中可以看得很清楚,前台想要调用接口,需要使用几个参数生成签名。

  • 时间戳:当前时间
  • 随机数:随机生成的随机数
  • 口令:前后台开发时,一个双方都知道的标识,相当于暗号
  • 算法规则:商定好的运算规则,上面三个参数可以利用算法规则生成一个签名。

前台生成一个签名,当需要访问接口的时候,把时间戳,随机数,签名通过 URL 传递到后台。后台拿到时间戳,随机数后,通过一样的算法规则计算出签名,然后和传递过来的签名进行对比,一样的话,返回数据。


算法规则

在前后台交互中,算法规则是非常重要的,前后台都要通过算法规则计算出签名,至于规则怎么制定,看你怎么高兴怎么来。

我这个算法规则是

  1. 时间戳,随机数,口令按照首字母大小写顺序排序
  2. 然后拼接成字符串
  3. 进行 sha1 加密
  4. 再进行 MD5 加密
  5. 转换成大写。


前台

这里我并没有实际的前台,直接使用一个 PHP 文件代替前台,然后通过 CURL 模拟 GET 请求。我使用的是 TP 框架,URL 格式是 pathinfo 格式。


源代码

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/3/16 0016
 * Time: 15:56
 */
namespace Client\Controller;
use Think\Controller;

class ClientController extends Controller{
    const TOKEN = 'API';
    //模拟前台请求服务器api接口
    public function getDataFromServer(){
        //时间戳
        $timeStamp = time();
        //随机数
        $randomStr = $this -> createNonceStr();
        //生成签名
        $signature = $this -> arithmetic($timeStamp,$randomStr);
        //url地址
        $url = "http://www.apitest.com/Server/Server/respond/t/{$timeStamp}/r/{$randomStr}/s/{$signature}";
        $result = $this -> httpGet($url);
        dump($result);
    }

    //curl模拟get请求。
    private function httpGet($url){
        $curl = curl_init();

        //需要请求的是哪个地址
        curl_setopt($curl,CURLOPT_URL,$url);
        //表示把请求的数据已文件流的方式输出到变量中
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);

        $result = curl_exec($curl);
        curl_close($curl);
        return $result;
    }

    //随机生成字符串
    private function createNonceStr($length = 8) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return "z".$str;
    }

    /**
     * @param $timeStamp 时间戳
     * @param $randomStr 随机字符串
     * @return string 返回签名
     */
    private function arithmetic($timeStamp,$randomStr){
        $arr['timeStamp'] = $timeStamp;
        $arr['randomStr'] = $randomStr;
        $arr['token'] = self::TOKEN;
        //按照首字母大小写顺序排序
        sort($arr,SORT_STRING);
        //拼接成字符串
        $str = implode($arr);
        //进行加密
        $signature = sha1($str);
        $signature = md5($signature);
        //转换成大写
        $signature = strtoupper($signature);
        return $signature;
    }
}


服务器端

接受前台数据进行验证


源代码

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/3/16 0016
 * Time: 16:01
 */
namespace Server\Controller;
use Think\Controller;

class ServerController extends Controller{
    const TOKEN = 'API';

    //响应前台的请求
    public function respond(){
        //验证身份
        $timeStamp = $_GET['t'];
        $randomStr = $_GET['r'];
        $signature = $_GET['s'];
        $str = $this -> arithmetic($timeStamp,$randomStr);
        if($str != $signature){
            echo "-1";
            exit;
        }
        //模拟数据
        $arr['name'] = 'api';
        $arr['age'] = 15;
        $arr['address'] = 'zz';
        $arr['ip'] = "192.168.0.1";
        echo json_encode($arr);
    }

    /**
     * @param $timeStamp 时间戳
     * @param $randomStr 随机字符串
     * @return string 返回签名
     */
    public function arithmetic($timeStamp,$randomStr){
        $arr['timeStamp'] = $timeStamp;
        $arr['randomStr'] = $randomStr;
        $arr['token'] = self::TOKEN;
        //按照首字母大小写顺序排序
        sort($arr,SORT_STRING);
        //拼接成字符串
        $str = implode($arr);
        //进行加密
        $signature = sha1($str);
        $signature = md5($signature);
        //转换成大写
        $signature = strtoupper($signature);
        return $signature;
    }
}


结果

string(57) "{"name":"api","age":15,"address":"zz","ip":"192.168.0.1"}"


总结

这种方法只是其中的一种方法,其实还有很多方法都是可以进行安全验证的。

标签:arr,randomStr,timeStamp,接口,api,str,signature,curl,php
From: https://blog.51cto.com/u_15964265/6178873

相关文章

  • ava: 程序包com.alibaba.nacos.api.common不存在_RuoYi-Cloud-Plus-master_jar包不存
    来看看原因吧,jar包是存在的,但是就是在idea中引用不到,来看看怎么回事: 原来就是这个包找不到,但是从下面看是有的: 但是注意,这里的com.alibaba.nacos.api...原来可不是这样的,这个是我后来修改过的,原来是只有com.alibaba.nacos.common,而引用的是com.alibaba.nacos.api.commo......
  • [从0开始]PHP+phpstudy留言板项目搭建教程及报错详析
    [从0开始]PHP+phpstudy留言板项目搭建教程及报错详析基础知识及工具准备基础知识:四种语言PHPPHP是在服务器端执行的脚本语言,适用于Web开发并可嵌入HTML中。学习网站:PHP教程|菜鸟教程SQLSQL是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统......
  • 利用百度云api实现人脸对比
    #encoding:utf-8importbase64importrequestsdefgetToken():ak='B7E2OqVuDAyDs7OsuGPuKa4y'sk='idObOz6jqA2GdU49L2VG4VPVhgmiidvD'host=f'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_......
  • HTTP接口风格就俩:RPC和RESTFul
    基于.NetCore开发博客项目StarBlog-(21)开始开发RESTFul接口 前言最近电脑坏了,开源项目的进度也受到一些影响这篇酝酿很久了,作为本系列第二部分(API接口开发)的第一篇,得想一个好的开头,想着想着就鸽了好久,索性不扯那么多了,直接开写吧~关于RESTFul网上很多相关的文章都要......
  • SAP ABAP 中,if_http_extension 接口的flow_rc 字段含义
    我们在SAPABAPGateway系统的框架实现代码,/iwfnd/cl_sodata_http_handler的handle_request方法里,能看到代码第55行对if_http_extension这个接口的属性字段flow_rc进行赋值。在SAPABAP中,if_http_extension接口是用于处理HTTP请求和响应的标准接口。其中,flow_r......
  • 从k8s 的声明式API 到 GPT的 提示语
    命令式命令式有时也称为指令式,命令式的场景下,计算机只会机械的完成指定的命令操作,执行的结果就取决于执行的命令是否正确。GPT之前的人工智能就是这种典型的命令式,通过不断的炼丹,告诉计算机要怎么做,计算机只是机械的完成指定场景下的任务。声明式声明式也称为描述式或者申明式,这......
  • Go接口:运维开发场景中,go的接口到底怎么用?
    golang的接口是什么在Golang中,接口是一种类型,它是由一组方法签名组成的抽象集合。接口定义了对象应该具有的行为,而不关心对象的具体实现。实现接口的对象必须实现接口定义的所有方法,这样才能称为该接口的实现。什么情况下要用接口定义通用的方法:接口可以定义一组通用的方法,......
  • API实例详解
    一、访问网页地址:get(url)Java代码Stringurl="http://www.baidu.com";driver.get(url); 二、刷新当前网页:navigate().refresh()java代码Stringurl="http://www.baidu.com";driver.get(url);driver.findElement(By.id("kw")).sendKeys("123......
  • JDBC-API详解--PreparedStatement
    PreparedStatement作用:1.预编译sql语句并执行:预防sql注入问题·sql注入sql注入是通过操作输入来修改事先定义好的sql语句,用以执行代码来对服务器进行攻击的方法写法: Stringsql="select*fromuserwhereusername=?andpassword=?";//注意参数要写成问号。Prep......
  • JDBC-API详解--ResultSet
    ResultSet作用:1.封装查询语句ResultSetexecuteQuery(sql):执行查询语句,返回ResultSet对象。·获取查询结果:booleannext();  1将光标从当前位置向前移动一行2判断当前行是否为有效行。返回值:true为有效行 false为无效行XXXgetXxx(参数)用于获取数据参数:可以是int......