因此,我正在使用gadgets.io.makeRequest(url, callback, params)
向Gmail上下文小工具发出请求,并在服务器端验证这些请求。
为了澄清,我在小工具一侧使用了以下makeRequest参数:
params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.DOM;
params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;
params["OAUTH_SERVICE_NAME"] = "HMAC";
params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.GET;
我从https://www.google.com/gadgets/directory/verify获得了小工具的consumerKey和consumerSecret
根据Google的文档,该请求由容器根据OAuth signing process HMAC-SHA1方法签署。
在服务器端,我收到以下请求:
然后我根据Google应该使用的相同OAuth规范签署此请求,但签名不匹配。
我已经尝试使用2个不同的库来签署请求:
两个lib都生成类似的签名基本字符串。然而,奇怪的是,他们产生了不同的签名,这些签名都不匹配Google在oauth_signature param中发送的签名!
同事小工具开发人员,我希望你们中的某些人比我更幸运,并使这个签名验证方法有效。拜托,告诉我这里的错误。
提前致谢,
布鲁
答案 0 :(得分:1)
我成功地使用了这个:
public Boolean ValidateSignature(String method, Uri url)
{
String normalizedUrl, normalizedRequestParameters;
List<QueryParameter> parameters = new List<QueryParameter>();
parameters.AddRange(GetQueryParameters(url.Query));
var sigParam = parameters.Find(p => p.Name == OAuthSignatureKey);
if (sigParam == null)
return false;
var expected = sigParam.Value;
parameters.Remove(parameters.Find(p => p.Name == OAuthSignatureKey));
parameters.Sort(new QueryParameterComparer());
normalizedUrl = string.Format("{0}://{1}", url.Scheme, url.Host);
if (!((url.Scheme == "http" && url.Port == 80) || (url.Scheme == "https" && url.Port == 443)))
{
normalizedUrl += ":" + url.Port;
}
normalizedUrl += url.AbsolutePath;
normalizedRequestParameters = NormalizeRequestParameters(parameters);
StringBuilder signatureBase = new StringBuilder();
signatureBase.AppendFormat("{0}&", method.ToUpper());
signatureBase.AppendFormat("{0}&", UrlEncode(normalizedUrl));
signatureBase.AppendFormat("{0}", UrlEncode(normalizedRequestParameters));
HMACSHA1 hmacsha1 = new HMACSHA1();
hmacsha1.Key = Encoding.ASCII.GetBytes(string.Format("{0}&{1}", UrlEncode(ConsumerSecret), ""));//string.IsNullOrEmpty(tokenSecret) ? "" : UrlEncode(tokenSecret)));
var computed = GenerateSignatureUsingHash(signatureBase.ToString(), hmacsha1);
return expected == UrlEncode(computed);
}
以及您可以在此处找到的代码: http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs
修改强>: 当通过get或post发出请求和发送参数时,这不起作用。 似乎问题是Gmail会先使用大写字符对参数进行排序。我只使用小写参数,但您可以轻松修复代码,以确保大写字母在小写之前。
答案 1 :(得分:1)
Daniels方法只需稍作修改即可正常工作。
我的主要问题是拨打电话的小工具是将gadgets.io.makeRequest用于'http://myserver.com',但处理页面是'http://myserver.com/default.aspx'。由于这种差异,签名未经验证。在Gadget中使用gadgets.io.makeRequest调用'http://myserver.com/default.aspx'解决了问题。