- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
使用这个 repository当必须提供 oauth_token
时,我无法进行查询。我总是得到无效的签名。在代码中尝试了很多解决方案和调整,但没有任何效果。请帮忙。
这是来自提到的 git 的代码:
NSString *OAuthorizationHeader(NSURL *url, NSString *method, NSData *body, NSString *_oAuthConsumerKey, NSString *_oAuthConsumerSecret, NSString *_oAuthToken, NSString *_oAuthTokenSecret)
{
NSString *_oAuthNonce = [NSString ab_GUID];
NSString *_oAuthTimestamp = [NSString stringWithFormat:@"%d", (int)[[NSDate date] timeIntervalSince1970]];
NSString *_oAuthSignatureMethod = @"HMAC-SHA1";
NSString *_oAuthVersion = @"1.0";
NSMutableDictionary *oAuthAuthorizationParameters = [NSMutableDictionary dictionary];
[oAuthAuthorizationParameters setObject:_oAuthNonce forKey:@"oauth_nonce"];
[oAuthAuthorizationParameters setObject:_oAuthTimestamp forKey:@"oauth_timestamp"];
[oAuthAuthorizationParameters setObject:_oAuthSignatureMethod forKey:@"oauth_signature_method"];
[oAuthAuthorizationParameters setObject:_oAuthVersion forKey:@"oauth_version"];
[oAuthAuthorizationParameters setObject:_oAuthConsumerKey forKey:@"oauth_consumer_key"];
if(_oAuthToken)
[oAuthAuthorizationParameters setObject:_oAuthToken forKey:@"oauth_token"];
// get query and body parameters
NSDictionary *additionalQueryParameters = [NSURL ab_parseURLQueryString:[url query]];
NSDictionary *additionalBodyParameters = nil;
if(body) {
NSString *string = [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding];
if(string) {
additionalBodyParameters = [NSURL ab_parseURLQueryString:string];
}
}
// combine all parameters
NSMutableDictionary *parameters = [oAuthAuthorizationParameters mutableCopy];
if(additionalQueryParameters) [parameters addEntriesFromDictionary:additionalQueryParameters];
if(additionalBodyParameters) [parameters addEntriesFromDictionary:additionalBodyParameters];
// -> UTF-8 -> RFC3986
NSMutableDictionary *encodedParameters = [NSMutableDictionary dictionary];
for(NSString *key in parameters) {
NSString *value = [parameters objectForKey:key];
[encodedParameters setObject:[value ab_RFC3986EncodedString] forKey:[key ab_RFC3986EncodedString]];
}
NSArray *sortedKeys = [[encodedParameters allKeys] sortedArrayUsingFunction:SortParameter context:(__bridge void *)(encodedParameters)];
NSMutableArray *parameterArray = [NSMutableArray array];
for(NSString *key in sortedKeys) {
[parameterArray addObject:[NSString stringWithFormat:@"%@=%@", key, [encodedParameters objectForKey:key]]];
}
NSString *normalizedParameterString = [parameterArray componentsJoinedByString:@"&"];
NSLog(@"normalizedParameters: %@", normalizedParameterString);
NSString *normalizedURLString;
if ([url port] == nil) {
normalizedURLString = [NSString stringWithFormat:@"%@://%@%@", [url scheme], [url host], [url path]];
} else {
normalizedURLString = [NSString stringWithFormat:@"%@://%@:%@%@", [url scheme], [url host], [url port], [url path]];
}
NSString *signatureBaseString = [NSString stringWithFormat:@"%@&%@&%@",
[method ab_RFC3986EncodedString],
[normalizedURLString ab_RFC3986EncodedString],
[normalizedParameterString ab_RFC3986EncodedString]];
NSLog(@"signature base: %@", signatureBaseString);
NSString *key = [NSString stringWithFormat:@"%@&%@&",
[_oAuthConsumerSecret ab_RFC3986EncodedString],
[_oAuthTokenSecret ab_RFC3986EncodedString]];
NSLog(@"key codes: %@", key);
NSData *signature = HMAC_SHA1(signatureBaseString, key);
NSString *base64Signature = [signature base64EncodedString];
// PARKER CHANGE: changed oAuthAuthorizationParameters to parameters
NSMutableDictionary *authorizationHeaderDictionary = [parameters mutableCopy];
[authorizationHeaderDictionary setObject:base64Signature forKey:@"oauth_signature"];
NSMutableArray *authorizationHeaderItems = [NSMutableArray array];
for(NSString *key in authorizationHeaderDictionary) {
NSString *value = [authorizationHeaderDictionary objectForKey:key];
NSLog(@"KEY: %@", key);
NSLog(@"VALUE: %@", value);
// PARKER CHANGE: removed quotes that surrounded each value
[authorizationHeaderItems addObject:[NSString stringWithFormat:@"%@=%@",
[key ab_RFC3986EncodedString],
[value ab_RFC3986EncodedString]]];
}
// PARKER CHANGE: changed concatentation string from ", " to "&"
NSString *authorizationHeaderString = [authorizationHeaderItems componentsJoinedByString:@"&"];
// authorizationHeaderString = [NSString stringWithFormat:@"OAuth %@", authorizationHeaderString];
NSLog(@"final: %@", authorizationHeaderString);
return authorizationHeaderString;
}
我是这样调用它的:
- (void) makeUserRequestWithMethod:(NSString *)method
parameters:(NSDictionary *)params
completion:(void (^)(NSDictionary *data))completionBlock {
NSLog(@"%s", __func__);
NSMutableDictionary *parameters = [params mutableCopy];
[parameters addEntriesFromDictionary:[self defaultParameters]];
[parameters addEntriesFromDictionary:@{ @"method" : method }];
NSString *queryString = [self queryStringFromDictionary:parameters];
NSData *data = [NSData dataWithBytes:[queryString UTF8String] length:queryString.length];
NSString *authHeader = OAuthorizationHeader([NSURL URLWithString:FAT_SECRET_API_ENDPOINT],
@"POST",
data,
_oauthConsumerKey,
_oauthConsumerSecret,
_oAuthToken,
_oAuthTokenSecret
);
NSLog(@"header: %@", authHeader);
NSURL *url = [NSURL URLWithString:[FAT_SECRET_API_ENDPOINT stringByAppendingFormat:@"?%@", authHeader]];
[[[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (data) {
id JSON = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
completionBlock(JSON);
} else {
completionBlock(nil);
}
}] resume];
}
最佳答案
我要冒昧地说,其他人证明有效的代码在这里可能没有错,而是先看看你自己的代码。您说错误消息是“无效签名”,这听起来像是来自您调用的服务器的警告,而不是来自您正在使用的代码的警告。
[parameters addEntriesFromDictionary:[self defaultParameters]];
[parameters addEntriesFromDictionary:@{ @"method" : method }];
NSString *queryString = [self queryStringFromDictionary:parameters];
[self defaultParameters]
内部发生了什么,您是否 100% 确定参数适合您调用的 API(包括拼写)?
您是否已验证 [self queryStringFromDictionary:parameters]
准备了格式正确的查询字符串,并且没有引入一些错误(例如,非转义特殊字符或百分比编码)?
关于objective-c - 脂肪 secret API "invalid signature",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50052301/
我在 another question 中遇到此错误消息我想知道签名中的 $: 部分是什么意思? Cannot resolve caller index(Str: Str, Any); none of
Android Studio 2.3 Generate Signed Apk Second Step Signature Verification v1(Jar Signature), v2(Full
我正在尝试使用 PHPMailer 类使用 DKIM 对电子邮件进行签名,但我无法让它工作。 当我在 gmail 上看到我的电子邮件中的 header 时,我发现该类已成功在电子邮件 header 中
我正在尝试 Animal Sniffer . 我已经创建了 .signature 文件。但是要运行 check,我需要一个“签名 Artifact ”。 org.codehaus.mojo.
我想知道 Crypto.Signature.PKCS1_v1_5 和 Crypto.Signature.pkcs1_15 有什么区别? 在documentation他们使用此函数 Crypto.Sig
我正在尝试使用 AWS S3 SDK 上传图片。现在这之前可以工作,但由于某种原因它停止工作并且我开始收到此错误: 现在,当我点击链接时,它给我一个“NoSuchKey”错误: 我不太明白这一点,因为
当 Facebook 发送实时更新时,它们会在 HTTP header 中包含 X-Hub-Signature。根据他们的文档(http://developers.facebook.com/docs/
我正在使用 NuGet 的 Stripe.net SDK。我总是得到 The signature for the webhook is not present in the Stripe-Signat
从 DocumentDB 请求文档时,我偶尔会遇到 UnauthorizedException。该问题看起来类似于 Azure DocumentDB - The MAC signature found
我用我自己的文件替换了不同 dpi 文件夹中的默认 Logo 文件“ic_launcher.png”,也命名为“ic_launcher.png”,但现在我收到此错误: Error: failed to
当 Facebook 发送实时更新时,它们会在 HTTP header 中包含一个 X-Hub-Signature。根据their documentation ,他们使用 SHA1 和应用程序 sec
我有兴趣将带有 RSA 签名的 SHA-1 散列应用于某些数据,但我需要分两步进行 - 首先应用散列,然后对数据进行签名。 Signature.sign() 函数似乎创建了一个更复杂的(ASN.1?)
我将 spring boot 和 spring security 与 JWT on rest 服务一起使用。我使用了以下链接中的代码: https://www.javainuse.com/spring
我正在使用 Stripe 提供的代码来测试 webhook。 Stripe secret 和端点 secret 已经过三重检查。 Stripe 版:6.19 正文解析器:1.19 当我在 Stripe
我有一个调用 Firebase 函数的条纹 webhook。在这个函数中,我需要验证这个请求来自 Stripe 服务器。这是代码: const functions = require('firebas
我已经在网上搜索了两天多,并且可能浏览了大多数在线记录的场景和解决方法,但到目前为止没有任何效果。 我使用的是在 PHP 5.3 上运行的 PHP V2.8.7 的 AWS SDK。 我尝试使用以下代
您好,我正在使用 WooCommerce API - Node.js 客户端 https://www.npmjs.com/package/woocommerce-api 我正在尝试创建一个需要向服务器
我正在尝试创建一个预签名 URL,以帮助某些客户上传文件。这是我当前正在运行的测试脚本 # Get the service client. s3 = boto3.client('s3') boto3.
我编写了一个类,旨在使用服务器上的私钥对文本字符串进行签名和 base64,然后返回签名。每次针对相同文本运行时,它都会生成不同的签名。它为什么要这么做呢?我通过在我的测试机器上暂时禁用转换来检查是否
我们正在使用支持 OAuth 2 多边身份验证的 API。尝试运行我的 rest sharp 客户端 OAuth1Authenticator 实现时出现以下错误: Message: HTTP Stat
我是一名优秀的程序员,十分优秀!