Android客户端:

1、写一个生成token的算法

    /*** 生成api接口的token* @param map* @param apikey* @return*/public static String createToken(Map<String, String> map,String apikey){StringBuffer sb=new StringBuffer();for (String value : map.values()) {  sb.append(md5(value));}SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd 00:00:00");String time=format.format(new Date());//token生成规则:md5(接口密钥+集合数据md5+今天的日期)String token=md5(apikey+sb.toString()+time);return token;}/*** MD5加密* @param plainText 要加密的字符串* @return*/public static String md5(String plainText){try {MessageDigest md = MessageDigest.getInstance("MD5");md.update(plainText.getBytes());byte b[] = md.digest();int i;StringBuffer buf = new StringBuffer("");for (int offset = 0; offset < b.length; offset++) {i = b[offset];if (i < 0)i += 256;if (i < 16)buf.append("0");buf.append(Integer.toHexString(i));}//32位加密return buf.toString();// 16位的加密//return buf.toString().substring(8, 24);} catch (Exception e) {e.printStackTrace();return null;}}

token生成规则可以自己定义,但要保证客户端与服务端计算的Token保持一致。

2、进行post请求时,添加上我们生成的token

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time=sdf.format(new Date());
Map<String,String> datamap=new HashMap<String,String>();
datamap.put("type","query");
datamap.put("money",100);
datamap.put("time",time);
//添加token参数
String apikey="dfgdfsgertyrewtretww";
String token=createToken(postmap,apikey);
postmap.put("token",token);
//后面这里就是执行post请求了(此处代码省略)

PHP服务端:

1、我后端使用的是Thinkphp5.0框架,写个公共的控制器类ApiBase.php

<?php
namespace app\index\controller;
use think\Controller;
use think\Request;class ApiBase extends Controller
{protected function _initialize(){parent::_initialize();//获取参数$params = Request::instance()->param();//验证是否超时$this->check_time($params);//验证token$this->check_token($params); }/*** api数据返回* @param [int] $code [结果码]* @param [string] $msg [接口要返回的提示信息]* @param [array] $data [接口要返回的数据]* @return [string] [最终的json数据]*/public function return_data($code, $msg = '', $data = []) {$return_data['code'] = $code;$return_data['msg'] = $msg;$return_data['data'] = $data;echo json_encode($return_data,JSON_UNESCAPED_UNICODE);die;}/*** 验证请求是否超时* @param [array] $arr [包含时间戳的参数数组]* @return [json] [检测结果]*/public function check_time($arr) {if (!isset($arr['time']) || intval($arr['time']) <= 1) {$this->return_data(0,'参数非法');}//超过5秒则超时if (time() - strtotime($arr['time']) > 5) {$this->return_data(0,'请求超时');}}/*** 验证token(防止篡改数据)* @param [array] $arr [全部请求参数]  * @return [json] [token验证结果]*/public function check_token($arr) {/*********** api传过来的token ***********/if (!isset($arr['token']) || empty($arr['token'])) {$this->return_data(0,'Token参数不能为空');}$api_token = $arr['token'];unset($arr['token']);/*********** 服务器端生成token ***********/        $md5_data = '';foreach ($arr as $key => $value) {$md5_data .= md5($value);}//token生成规则:md5(接口密钥+集合数据md5+今天的日期)$service_token = md5(Config('api_key'). $md5_data .date('Y-m-d 00:00:00', time())); /*********** 对比token,返回结果 ***********/if ($api_token !== $service_token) {$this->return_data(0,'Token令牌不正确');}}
}

2、api接口控制器实现类,直接继承这个ApiBase.php类即可自动验证token

<?php
namespace app\index\controller;
use think\Controller;
use think\Request;
use think\Cache;/*** Api接口通讯类*/
class Api extends ApiBase
{  public function _initialize(){   parent::_initialize(); }
}

Android客户端与PHP服务端API接口Token安全验证相关推荐

  1. 魔方APP项目-01-移动端开发相关概念、移动端自适配、元信息(meta)、开发准备、移动端项目搭建(模拟器调试)、APICloud(APICloud 前端框架,获取服务端API接口)

    一.移动端开发相关概念 1.APP类型 ①.Native APP Native APP又称原生APP,就是我们平时说的手机应用软件. 原生APP 是针对IOS.Android.Windows等不同的手 ...

  2. 解决android客户端上传图片到服务端时,图片损坏的问题

    解决android客户端上传图片到服务端时,图片损坏的问题 参考文章: (1)解决android客户端上传图片到服务端时,图片损坏的问题 (2)https://www.cnblogs.com/cnbl ...

  3. 视频列表的android客户端和springmvc服务端实现(三)

    项目运行图太大了,我放在github上了 https://github.com/1181631922/Recreation/blob/master/readme/video/videos2.gif 服 ...

  4. c pc 和android通讯,Android 客户端与PC服务端socket通信接收与发送图片(终结者)

    前言 这个解决方案是我和队友在<物联网>比赛的集训中得到的.在socket中Android客户端接收图片是相当的棘手(反正我当时就是这样觉得),接收文字还算简单.在刚开始接触socket接 ...

  5. 上传图片-服务端-Api接口定义

    API接口 模型类 系统的文件信息(图片.文档等小文件的信息)在mongodb中存储,下边是文件信息的模型类. 1) 模型如下: package com.learn.framework.domain. ...

  6. 不合法的偏移量 钉钉接口_钉钉服务端api接口使用

    /* *发送工作通知消息 */ router.post('/api/dingtalkserve/asyncsend_v2', async ({ request, response, session } ...

  7. uni-app - 九宫格老虎机抽奖机插件源码(支持服务端API接口控制最终中奖的奖品,自定义组件可随意配置和控制,带组件文档轻松 DIY 自己的营销页抽奖机)幸运抽奖圆形大转盘插件组件

    前言 如果您需要圆形大转盘抽奖机(如下图所示),请访问:这篇文章. 关于九宫格式老虎机宫格跳动抽奖,网上的大部分源码非常乱且无注释,根本无法改造, 本文提供的组件源码,代码干净整洁注释详细,并且配备超 ...

  8. 魔坊APP项目-15-邀请好友(业务逻辑流程图、服务端提供邀请好友的二维码生成接口、客户端通过第三方识别微信二维码,服务端提供接口允许访问、App配置私有协议,允许第三方应用通过私有协议,唤醒APP)

    邀请好友 1.业务逻辑流程图 客户端提供点击"邀请好友"以后的页面frame,html/invite.html,代码: <!DOCTYPE html> <html ...

  9. android java websocket client_websocket服务端,android客户端示例

    服务端库依赖详见章末 #####spring websocket服务端代码(会话过程) public class HandshakeInterceptor extends HttpSessionHan ...

最新文章

  1. 天顶角Zenith方位角Azimuth
  2. MinMaxScaler.fit 归一化数据的方法
  3. 华为云域名注册_关于域名购买的常识介绍,想建站的必看
  4. PHP数据库链接类(PDO+Access)
  5. CUDA编程快速入门教程
  6. 高精度矢量汉字的一种填充方法_使用PS中的钢笔工具制作一只蝴蝶矢量插画
  7. 7月第4周全球域名商(国际域名)新增注册量TOP15
  8. Linux DMA 驱动学习总结
  9. 二十个让你泪流满面的瞬间
  10. centOS7安装nodejs(8.4.0)(详细步骤)
  11. 子序列问题sequence(【CCF】NOI Online能力测试2 提高组第二题 )
  12. Mac OS黑苹果系统安装工具及懒人版镜像文件 for macOS High Sierra/macOS Sierra
  13. DupanTools第三方不限速下载工具
  14. python通过opc读plc实例_python调用openopc读写plc
  15. 连接共享打印机时提示无法访问计算机,win10共享打印机提示无法访问.你可能没有权限使用网络资源怎么解决...
  16. 【CSDN软件工程师能力认证学习精选】十分详细的React入门实例
  17. 【八校联考2013】百团大战
  18. echarts饼图默认中间显示总数
  19. ceph分布式存储-常见 PG 故障处理
  20. 小程序华为手机canvas不显示问题

热门文章

  1. 各种Lisp系语言大检阅
  2. oracle 11g安装包下载地址合集
  3. 百度AI身份证识别接口,iOS上传base64图片报错216201问题解决办法总结
  4. Lecture 9: Practical Tips for Final Projects
  5. Adobe Audition生成正弦波音频
  6. iphone 4 程序开发:真机测试 (免费无99刀)
  7. 【java】java技术要学习的内容
  8. idea项目管理github无法登陆
  9. oneshot一次性服务
  10. 俺老孙画个圈-板框与安装孔-PCB系列教程1-10