七牛 回调 java_七牛回调验证(java,php源码)
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源码)相关推荐
- 域名正版验证系统,PHP域名查询验证完整无误源码下载,域名验证系统完整源码
域名正版验证系统,PHP域名查询验证完整无误源码下载,域名验证, 由于优雅草系列产品盗版横行需要建立开源制度和正版授权查询,曾经寻找过没有可用的原计划自行写一个,不料到突然发现一个宝贝,完整可用并且优 ...
- 单点登录 cas 设置回调地址_cas客户端流程详解(源码解析)单点登录
博主之前一直使用了cas客户端进行用户的单点登录操作,决定进行源码分析来看cas的整个流程,以便以后出现了问题还不知道是什么原因导致的 cas主要的形式就是通过过滤器的形式来实现的,来,贴上示例配置: ...
- 短线牛股技术买点图解 擒牛选股预警 通达信选股公式 副图 源码
擒牛选股预警指标思路: 很多刚踏入股票行业的新手是否都有这种担忧呢?不知道什么时候买入和卖出股票是最合适的?牛股形态选股公式怎样判别呢? 所谓牛股,它是指一种涨幅和换手率在某一时期内高于其他个股的一种 ...
- 筷子SaaS,爱获客,牛视,树品,短视频营销源码独立部署,一站式服务
抖音短视频营销是通过A I大数据人工智能技术,研发出以企业号运营.矩阵助推.A I智能助手.A I智能运营.能量充电站五大功能为核心的企业短视频融媒体行业解决方案,从根本上为企业在短视频领取解决曝光, ...
- 【源码分析】极验验证官方SDK源码分析和实现思路
前言 2016年就这么来了,新的一年,继续努力~ 最近,除了12306的验证码火起来以后,还有一个在界面上拖拽的验证码,也火了起来,就是这次要说的极验验证,在这个万众创新的时代,工具类产品能做到这样, ...
- 前端JS——滑动滑块验证登录(源码及效果)
源码: <!doctype html> <html lang="en"><head><meta charset="UTF-8&q ...
- 简单介绍下阿里云的H5滑动验证+H5示例源码
我承认我是很菜,不过还好我喜欢看别人的源码,看过以后我还喜欢分享出来,给你们也看看,不要觉得我很伟大, 事实上我就是那么伟大(滚犊子,还写不写了),嗯,好的,下面开始. 效果预览: 这是用的阿里云的组 ...
- Spring Security 4 整合Hibernate 实现持久化登录验证(带源码)
上一篇文章:Spring Security 4 整合Hibernate Bcrypt密码加密(带源码) 原文地址:http://websystique.com/spring-security/spri ...
- 基于GmSSL的国密SSL单向验证客户端C源码
1 搭建测试服务器 基于GmSSL搭建Nginx国密反代服务器 2 C 源码 #include <stdio.h> #include <string.h> #include & ...
最新文章
- 关于jquery.AutoComplete插件的一些使用心得(编码问题,效率问题)
- IOS - 本地消息推送
- 【自动化__持续集成】___java___对象
- android一键分享功能不使用任何第三方sdk
- mysql镜像_Mysql phpmyadmin docker镜像安装
- poj 4468Spy(kmp算法)
- LeetCode 第 25 场双周赛(718/1832,前39.2%)
- 【学习笔记】第二章——线程与多线程模型
- 免费素材下载:超棒的摄影相关图标下载
- 利用BI搭建零售业数据信息平台
- 转:什么是Node.js?
- 谈一谈python中的魔法变量*args和**kwargs
- java编程题50道
- QCC3040----SOC模块
- The7th Zhejiang Provincial Collegiate Programming Contest-Problem A:A - Who is Older?
- ubuntu+python2.7+tensorflow-gpu安装
- DP(Nietzsche)的hu测 T2(dp)
- cr全称是什么意思,城域网中的AC、BRAS、SW、SR、CR是什么意思
- 位运算——强大得令人害怕
- 《有限与无限的游戏》
热门文章
- Windows Server 2012 R2 IE浏览器安(qi)装(yong)Adobe Flash Player
- 即使是庸才我也要成为庸才中的人才
- 《惢客创业日记》2019.04.25(周四)如何解决骚扰电话?
- 深入浅出理解 MyBatis-Plus(最新版3.5.2)
- vue获取当前时间、时间戳方法
- Oracle数据系列(四)、高级查询2
- Shell中if的使用详解_与||的使用详解
- 不管几岁,少女心万岁~女神节快乐!
- 中职生计算机系自我推荐作文,中职生自我鉴定
- LeetCode(SQL)难度-中等