我正在使用JavaScript与第三方服务进行通信。作为认证流程的一部分,他们需要对包含图像的“multipart/form”POST消息体进行md5加密,并将其添加到包括日期和其他几个内容的字符串中,然后在其上运行HMAc/SHA1。因此最终,他们会获得多部分正文、日期和身份验证哈希值以便进行身份验证并读取图片。
这对于除了Windows Phone以外的所有移动设备都有效(我知道,这是IE的问题...谁能想到呢?)。他们的httpwebrequest没有包括'日期'头,因此无法进行身份验证。这意味着我必须在Windows Phone上转而使用C#中新发布的httpclient代码。现在我对C#一窍不通,因此这可能是简单解决方法所在。通过将几乎所有内容传递给C#并仅使用C#进行POST操作,我已经成功进行了身份验证,但是他们无法读取正文,因为我发现唯一发送边界的方法是在将内容定义为multipartformDatacontent并以这种方式发送内容时,会更改正文,从而导致身份验证失败。
我的JavaScript大致如下:
var boundary = "------------ThIs_Is_tHe_bouNdaRY_";
var part1Array = [];
var part1 = "--"+boundary + "\r\n"+
"Content-Disposition: form-data; name=\"image\"\r\n"+
"Content-Type: image/jpg\r\n"+
"\r\n";
var part3Array = [];
var part3 = "\r\n" + boundary +"--";
for(var p1=0; p1<part1.length; p1++){
part1Array.push(part1.charCodeAt(p1));
}
for(var p3=0; p3<part3.length; p3++){
part3Array.push(part3.charCodeAt(p3));
}
var bodyContent = part1Array.concat(imageArray,part3Array);
//hash this
var authMessage = bodyContentHash +"\n"+ contentType +"\n"+ todayString +"\n"+ pathandstuff;
// -hmac -sha1 -base64
而 C# 是:
HttpClient client = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, path);
request.Headers.Date = DateTime.ParseExact(todaydate, "ddd',' dd MMM yyyy HH:mm:ss 'GMT'", new CultureInfo("en-US"), DateTimeStyles.AssumeUniversal);
request.Headers.Add("Accept", "application/json; charset=utf-8");
request.Headers.Add("Authorization", auth);
byte[] body = Convert.FromBase64String(bodyData);
request.Content = new ByteArrayContent(body);
request.Content.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data");
request.Content.Headers.Add("boundary", "------------ThIs_Is_tHe_bouNdaRY_");
HttpResponseMessage response = client.SendAsync(request).Result;
string resultCode = response.StatusCode.ToString();
string responseBodyAsText = await response.Content.ReadAsStringAsync();
这基本上可以工作了..正文内容和标题都是正确的..除了内容类型标头应该是:
request.Content.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data, boundary=------------ThIs_Is_tHe_bouNdaRY_");
但是,这会抛出一个System.FormatException错误。