api接口签名认证的一种方式
请求方
try
{
using (var client = new HttpClient())
{
StringContent content = new StringContent(strParam);//参数序列化后,放入StringContent
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");//设置type //放入head的名字可以随意设置(和接收方一直就可以),值需要单独生成,最主要就是auth_param
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("auth名称", auth_param);
var response = client.PostAsync(FlightQueryUrl, content).Result;
if (response.IsSuccessStatusCode)
{
string responseText = response.Content.ReadAsStringAsync().Result;
if (string.IsNullOrEmpty(responseText))
{
return null;
}
return responseText ;
}
return null;
}
}
catch (Exception ex)
{
return null;
}
auth_param的计算方式,需要和接收方的一致:
//认证key
private const string key = "认证key****#####$$$$$$@@@!!!!";
//认证秘钥
private const string secrect = "认证秘钥****#####$$$$$$@@@!!!!";
/// <summary>
/// 获取接口签名
/// </summary>
/// <param name="param">原始的请求参数</param>
/// <param name="url">请求地址</param>
/// <param name="requestId">请求Id,接入方自定义,最好用来区分每个请求</param>
/// <returns></returns>
public static string GetFlightSign(string param,string url,string requestId)
{
string timeStamp = GetTimeStamp();//获取时间戳
url = System.Web.HttpUtility.UrlEncode(url.ToLower());
/*
* {认证key}{原始请求参数}{调用方自定义requestId}{时间戳}{原始URL}{认证秘钥}(被调用方也是如此)
* 替换掉字符串中的换行与空格(被调用方也是如此)
*/
string source = $"{key}{param}{requestId}{timeStamp}{url}{secrect}".Replace(Environment.NewLine, string.Empty).Replace("\n", "").Replace(" ", "");
string hmac = GetMd5(source);
//auth_param 身份验证参数字符串
//{认证key}{}{调用方自定义requestId}{时间戳} 顺序需要更具被调用方设置
return $"{key}:{hmac}:{requestId}:{timeStamp}";
}
/// <summary>
/// 字符串编码
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private static string GetMd5(string str)
{
if (string.IsNullOrEmpty(str))
return str;
var sb = new StringBuilder(32);
var md5 = MD5.Create();
var output = md5.ComputeHash(Encoding.UTF8.GetBytes(str));
for (int i = 0; i < output.Length; i++)
sb.Append(output[i].ToString("X").PadLeft(2, '0'));
return sb.ToString();
}
/// <summary>
/// 获取时间戳
/// </summary>
/// <returns></returns>
private static string GetTimeStamp()
{
var initTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
TimeSpan ts = DateTime.UtcNow - initTime;
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
接收方
public class ReqAuthorizeAttribute:System.Web.Http.AuthorizeAttribute
{
/// <summary>
/// 进行验证
/// </summary>
/// <param name="actionContext"></param>
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if (actionContext.Request.Headers.Authorization != null)
{
//获取请求的 认证信息
string info = (actionContext.Request.Headers.Authorization.Parameter).Decrypt(); //todo:采用上面的方式,再次进行获取,然后比较 //也可以再次做调用次数统计等
//判断认证信息是否正确
if (string.Equals(info, secret))
{
IsAuthorized(actionContext);
}
else
{
HandleUnauthorizedRequest(actionContext);
}
}
else
{
HandleUnauthorizedRequest(actionContext);
}
}
/// <summary>
/// 验证不通过 返回401
/// </summary>
/// <param name="actionContext"></param>
protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
{
var challengeMsg = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
challengeMsg.Headers.Add("WWW-Authenticate", "Basic");
throw new System.Web.Http.HttpResponseException(challengeMsg);
}
}
api接口签名认证的一种方式的更多相关文章
- kbmmw 做REST 服务签名认证的一种方式
一般对外提供提供REST 服务,由于信息安全的问题, 都要采用签名认证,今天简单说一下在KBMMW 中如何 实现简单的签名服务? 整个签名服务,模仿阿里大鱼的认证方式,大家可以根据实际情况自己修改. ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--03--03CMDB信息安全API接口交互认证
#settings.py """ Django settings for AutoCmdb project. Generated by 'django-admin sta ...
- Android Studio签名打包的两种方式
签名打包的两种方式: 注:给我们自己开发的app签名,就代表着我自己的版权,以后要进行升级,也必须要使用相同的签名才行.签名就代表着自己的身份(即keystore),多个app可以使用同一个签名. 如 ...
- 从后端接口下载文件的2种方式:get方式、post方式
从后端接口下载文件的2种方式 一.get方式 直接使用: location.href='http://www.xxx.com/getFile?params1=xxx¶ms2=xxxx' ...
- RESTful接口签名认证实现机制
RESTful接口 互联网发展至今,催生出了很多丰富多彩的应用,极大地调动了人们对这些应用的使用热情.但同时也为互联网应用带来了严峻的考验.具体体现在以下几个方面: 1. 部署方式的改变:当用 ...
- IdentityServer4实现.Net Core API接口权限认证(快速入门)
什么是IdentityServer4 官方解释:IdentityServer4是基于ASP.NET Core实现的认证和授权框架,是对OpenID Connect和OAuth 2.0协议的实现. 通俗 ...
- 在Spring-Boot中实现通用Auth认证的几种方式
code[class*="language-"], pre[class*="language-"] { background-color: #fdfdfd; - ...
- 【RPC】远程接口调用实例 的几种方式比较
pring中,用JMS搞RPC时会用到: org.springframework.jms.remoting.JmsInvokerServiceExporter org.springframework. ...
- API接口签名校验
在开发app中,我们经常要为app提供接口.但是为了保证数据的安全,我们通常会对接口的参数进行加密. 1.不验证的接口api api接口请求,"http://www.xx.com/getUs ...
随机推荐
- Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解
前言 大家好,给大家带来Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解的概述,希望你们喜欢 Activity是什么 作为一个Activ ...
- 设置win版vim启动项[利刃篇]
vim默认启动设置有时不太好,想改一下,但是又不像windows其他软件那样,界面设置后就生效,这里需要手动设置文件才可以,那就赶紧设置一下吧! 修改文件为 vim安装目录/_vimrc 文件,或者在 ...
- 机器学习基石笔记:09 Linear Regression
线性回归假设: 代价函数------均方误差: 最小化样本内代价函数: 只有满秩方阵才有逆矩阵. 线性回归算法流程: 线性回归算法是隐式迭代的. 线性回归算法泛化可能的保证: 根据矩阵的迹的性质:tr ...
- tf.cast()的用法(转)
一.函数 tf.cast() cast( x, dtype, name=None ) 将x的数据格式转化成dtype.例如,原来x的数据格式是bool, 那么将其转化成float以后,就能够将其转化成 ...
- MySQL笔记(8)---备份与恢复
1.前言 本章记录数据库的备份与恢复操作.MySQL提供了很多工具完成备份工作:mysqldump.ibbackup.replication,也可以使用一些第三方的工具完成,如xtrabacup.LV ...
- 一文了解JAVA虚拟机的重要组成
JVM是JAVA平台的重要组成之一,因涉及知识点太多,故从以下几个方面对JVM进行浅层面的介绍,如果需要深入理解,推荐学习机械工业出版社的<深入理解JAVA虚拟机>. 请尊重作者劳动成果, ...
- maven自动部署项目以及常见问题解决
Maven自动部署war到Tomcat1. 在maven项目的pom里配置如下信息 <build> <finalName>dianxiao</finalName> ...
- 将文件内容隐藏在bmp位图中
首先要实现这个功能,你必须知道bmp位图文件的格式,这里我就不多说了,请看:http://www.cnblogs.com/xiehy/archive/2011/06/07/2074405.html 接 ...
- mysql计算两个日期相差的天数
DATEDIFF() 函数可以返回两个日期之间的天数. 如下: SELECT DATEDIFF('2015-06-29','2015-06-12') AS DiffDate 结果得17 SELECT ...
- Angular2入门:TypeScript的类型 - let , var, const
一.let 二.const