1,七牛的客户可以对七牛回调过来的信息做验证。防止其他网站的信息冒充七牛。

2,安全性

*由于回调地址是公网可任意访问的,回调服务如何确认一次回调是合法的呢?

七牛云存储在回调时会对请求数据签名,并将结果包含在请求头Authorization字段中,示例如下:

Authorization:QBox iN7NgwM31j4-BZacMjPrOQBs34UG1maYCAQmhdCV:tDK-3f5xF3SJYEAwsll5g=

其中QBox为固定值,iN7Ngw…dCV为用户的Accesskey,tDK-3f…5g=为签名结果(encoded_data)

回调服务器可以通过以下方法验证其合法性:

获取AUTHORIZATION字段值中的签名结果部分encoded_data

根据Accesskey选取正确的SecretKey

获取明文:data = Request.URL.Path +”\n” +Request.Body

部分语言或框架无法直接获取请求body的原始数据,在自行拼接时应当注意,body中的数据是经过URL编码的

采用HMAC-SHA1签名算法,对明文data签名,秘钥为SecretKey,比较签名结果是否与Authorization中的encoded_data字段相同,如相同则表明这是一个合法的回调请求

以PHP语言为示例,验证代码如下:*

/**

*C('accessKey')取得 AccessKey

*C('secretKey')取得 SecretKey

*callback.php 为回调地址的Path部分

*file_get_contents('php://input')获取RequestBody,其值形如:

*name=sunflower.jpg&hash=Fn6qeQi4VDLQ347NiRm-RlQx_4O2\

*&location=Shanghai&price=1500.00&uid=123

*/

function IsQiniuCallback(){

$authstr = $_SERVER['HTTP_AUTHORIZATION'];

if(strpos($authstr,"QBox ")!=0){

return false;

}

$auth = explode(":",substr($authstr,5));

if(sizeof($auth)!=2||$auth[0]!=C('accessKey')){

return false;

}

$data = "/callback.php\n".file_get_contents('php://input');

return URLSafeBase64Encode(hash_hmac('sha1',$data,C("secretKey"), true)) == $auth[1];

}

注意:如果回调数据包含用户的敏感数据,建议回调地址使用HTTPS协议

3,java源码

package com.qiniu.isValidCallback;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.qiniu.util.Auth;

import com.qiniu.util.StringUtils;

public class IsValidCallback extends HttpServlet {

/** * The doGet method of the servlet.
* * This method is called when a form has its tag value method equals to get. * *@param request the request send by the client to the server *@param response the response send by the server to the client *@throws ServletException if an error occurred *@throws IOException if an error occurred */

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String ak = "****";

String sk = "****";

Auth auth = Auth.create(ak,sk);

ServletContext context = getServletContext( );

String charset = request.getCharacterEncoding();

String Authorization = request.getHeader("Authorization");

String contentType = request.getHeader("Content-Type");

String line = "";

BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));

StringBuilder sb = new StringBuilder();

while ((line = br.readLine()) != null) {

sb.append(line);

}

String url = "https://14190f2ca55e.b.passageway.io/IsValidCallback/servlet/IsValidCallback";

boolean check = false;

check= auth.isValidCallback(Authorization,url,StringUtils.utf8Bytes(sb.toString()),contentType);

String authorization2 = "QBox " + auth.signRequest(url, StringUtils.utf8Bytes(sb.toString()), contentType);

context.setAttribute("Authorization", Authorization);

context.setAttribute("Authorization", Authorization);

context.setAttribute("authorization2", authorization2);

context.setAttribute("body", sb.toString());

context.setAttribute("contentType", contentType);

if(check){

context.log("签名通过 ok!");

context.setAttribute("check", "签名通过 ok");

}else{

context.log("No ok!");

context.setAttribute("check", "no ok");

}

response.setContentType("application/json");

response.setCharacterEncoding("utf-8");

String out = "{\"success\":\"ok\",\"name\":\"test1\"}";

response.getOutputStream().print(out);;

}

/** * The doPost method of the servlet.
* * This method is called when a form has its tag value method equals to post. * *@param request the request send by the client to the server *@param response the response send by the server to the client *@throws ServletException if an error occurred *@throws IOException if an error occurred */

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

七牛 回调 java_七牛回调验证(java,php源码)相关推荐

  1. 域名正版验证系统,PHP域名查询验证完整无误源码下载,域名验证系统完整源码

    域名正版验证系统,PHP域名查询验证完整无误源码下载,域名验证, 由于优雅草系列产品盗版横行需要建立开源制度和正版授权查询,曾经寻找过没有可用的原计划自行写一个,不料到突然发现一个宝贝,完整可用并且优 ...

  2. 单点登录 cas 设置回调地址_cas客户端流程详解(源码解析)单点登录

    博主之前一直使用了cas客户端进行用户的单点登录操作,决定进行源码分析来看cas的整个流程,以便以后出现了问题还不知道是什么原因导致的 cas主要的形式就是通过过滤器的形式来实现的,来,贴上示例配置: ...

  3. 短线牛股技术买点图解 擒牛选股预警 ​通达信选股公式 副图 源码

    擒牛选股预警指标思路: 很多刚踏入股票行业的新手是否都有这种担忧呢?不知道什么时候买入和卖出股票是最合适的?牛股形态选股公式怎样判别呢? 所谓牛股,它是指一种涨幅和换手率在某一时期内高于其他个股的一种 ...

  4. 筷子SaaS,爱获客,牛视,树品,短视频营销源码独立部署,一站式服务

    抖音短视频营销是通过A I大数据人工智能技术,研发出以企业号运营.矩阵助推.A I智能助手.A I智能运营.能量充电站五大功能为核心的企业短视频融媒体行业解决方案,从根本上为企业在短视频领取解决曝光, ...

  5. 【源码分析】极验验证官方SDK源码分析和实现思路

    前言 2016年就这么来了,新的一年,继续努力~ 最近,除了12306的验证码火起来以后,还有一个在界面上拖拽的验证码,也火了起来,就是这次要说的极验验证,在这个万众创新的时代,工具类产品能做到这样, ...

  6. 前端JS——滑动滑块验证登录(源码及效果)

    源码: <!doctype html> <html lang="en"><head><meta charset="UTF-8&q ...

  7. 简单介绍下阿里云的H5滑动验证+H5示例源码

    我承认我是很菜,不过还好我喜欢看别人的源码,看过以后我还喜欢分享出来,给你们也看看,不要觉得我很伟大, 事实上我就是那么伟大(滚犊子,还写不写了),嗯,好的,下面开始. 效果预览: 这是用的阿里云的组 ...

  8. Spring Security 4 整合Hibernate 实现持久化登录验证(带源码)

    上一篇文章:Spring Security 4 整合Hibernate Bcrypt密码加密(带源码) 原文地址:http://websystique.com/spring-security/spri ...

  9. 基于GmSSL的国密SSL单向验证客户端C源码

    1 搭建测试服务器 基于GmSSL搭建Nginx国密反代服务器 2 C 源码 #include <stdio.h> #include <string.h> #include & ...

最新文章

  1. 关于jquery.AutoComplete插件的一些使用心得(编码问题,效率问题)
  2. IOS - 本地消息推送
  3. 【自动化__持续集成】___java___对象
  4. android一键分享功能不使用任何第三方sdk
  5. mysql镜像_Mysql phpmyadmin docker镜像安装
  6. poj 4468Spy(kmp算法)
  7. LeetCode 第 25 场双周赛(718/1832,前39.2%)
  8. 【学习笔记】第二章——线程与多线程模型
  9. 免费素材下载:超棒的摄影相关图标下载
  10. 利用BI搭建零售业数据信息平台
  11. 转:什么是Node.js?
  12. 谈一谈python中的魔法变量*args和**kwargs
  13. java编程题50道
  14. QCC3040----SOC模块
  15. The7th Zhejiang Provincial Collegiate Programming Contest-Problem A:A - Who is Older?
  16. ubuntu+python2.7+tensorflow-gpu安装
  17. DP(Nietzsche)的hu测 T2(dp)
  18. cr全称是什么意思,城域网中的AC、BRAS、SW、SR、CR是什么意思
  19. 位运算——强大得令人害怕
  20. 《有限与无限的游戏》

热门文章

  1. Windows Server 2012 R2 IE浏览器安(qi)装(yong)Adobe Flash Player
  2. 即使是庸才我也要成为庸才中的人才
  3. 《惢客创业日记》2019.04.25(周四)如何解决骚扰电话?
  4. 深入浅出理解 MyBatis-Plus(最新版3.5.2)
  5. vue获取当前时间、时间戳方法
  6. Oracle数据系列(四)、高级查询2
  7. Shell中if的使用详解_与||的使用详解
  8. 不管几岁,少女心万岁~女神节快乐!
  9. 中职生计算机系自我推荐作文,中职生自我鉴定
  10. LeetCode(SQL)难度-中等