Ios OAuthGetRequestToken:签名\u无效错误

Ios OAuthGetRequestToken:签名\u无效错误,ios,oauth,google-data-api,Ios,Oauth,Google Data Api,我尝试使用google数据api,但在OAuthGetRequestToken遇到了困难。 我遵照指示: 我使用GET并在url之后添加查询参数 我通过以下方式创建签名的基本字符串: 按字母顺序获取并请求url和查询参数(不带oauth_签名) 当我使用HMAC-SHA1时,我使用“consumer secret”值来创建签名 最后,我使用url+查询参数,浏览器总是返回: 签名无效 基本字符串:获取和https%3A%2****** 我发现基本字符串与代码中的相同 我不知道哪里出了问题,请求帮

我尝试使用google数据api,但在OAuthGetRequestToken遇到了困难。 我遵照指示:

我使用GET并在url之后添加查询参数

我通过以下方式创建签名的基本字符串: 按字母顺序获取并请求url和查询参数(不带oauth_签名)

当我使用HMAC-SHA1时,我使用“consumer secret”值来创建签名

最后,我使用url+查询参数,浏览器总是返回: 签名无效 基本字符串:获取和https%3A%2******

我发现基本字符串与代码中的相同

我不知道哪里出了问题,请求帮助。 下面是我的代码: (hmac_sha1是正确的,因为我使用来自Oauth的样本数据进行测试)

#导入“ContactTestViewController.h”
#导入“ASIHTTPRequest.h”
#进口
#进口
#导入“Base64.h”
#导入“NSStringAdditions.h”
#导入“NSData+Base64.h”
#定义kAllContacts@“https://www.google.com/m8/feeds/contacts/default/full"
#定义kOauthGetRequestToken@“https://www.google.com/accounts/OAuthGetRequestToken"
#定义kOauthConsumerKey@“oauth_consumer_key=***.net”
#定义KoAuthConsumerCret@“***/*****”
#定义kOauthNonce@“oauth_nonce=4572616248616265724761686176”
#定义kOauthSigMethod@“oauth_签名_method=HMAC-SHA1”
#定义kOauthSignature@“oauth_签名=”
#定义kOauthTimeStamp@“oauth_时间戳=”
#定义kOauthScope@“范围=https://www.google.com/m8/feeds/contacts/default/full"
#定义kOauthCallback@“oauth_callback=http://**.net/index.html”
#定义kOauthVersion@“oauth_版本=1.0”
#定义kXOauthDisplayname@“”
@ContactTestViewController的实现
-(NSString*)参数符号
{
NSDate*currentDate=[NSDate日期];
NSTimeInterval timeInter=[currentDate timeIntervalSince1970];
NSString*str=[NSString stringWithFormat:@“%@&%@&%@&%@&%@&%@%d&%@”,
kOauthCallback,
考特基,
考特农斯,
Koauthsig方法,
Koauth时间戳,
(int)时间间隔,
考特镜
];
返回str;
}
-(NSString*)主机代码:(NSString*)str
{
NSString*str1=[str STRINGBYREPLACINGOCURNCESOFSTRING:@:“withString:@”%3A“;
NSString*str2=[str1 STRINGBYREPLACINGOURCURNCESOFSTRING:@”/“withString:@”%2F“];
返回str2;
}
-(NSString*)参数编码:(NSString*)str
{
NSString*str1=[str STRINGBYREPLACINGOCURNCESOFSTRING:@”/“withString:@”%252F“];
NSString*str2=[str1 STRINGBYREPLACINGOURCURNCESOFSTRING:@:“withString:@”%253A“;
NSString*str3=[str2 stringByReplacingOccurrencesOfString:@“&”with string:@“%26”];
NSString*str4=[str3 STRINGBYREPLACINGOURCREPSOFSTRING:@“=”带字符串:@“%3D”];
返回str4;
}
-(NSString*)hmac_sha1:(NSString*)键文本:(NSString*)纯文本
{
const char*cKey=[key cStringUsingEncoding:NSASCIIStringEncoding];
const char*cData=[明文cStringUsingEncoding:NSASCIIStringEncoding];
char cHMAC[CC_SHA1_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1、cKey、strlen(cKey)、cData、strlen(cData)、cHMAC);
NSData*HMAC=[[NSData alloc]initWithBytes:cHMAC长度:CC_SHA1_DIGEST_length];
NSString*hash=[Base64编码:HMAC];//Base64
哈希=[HMAC base64EncodedString];
[HMAC释放];
返回散列;
}
-(无效)授权测试
{
NSString*parameterNoSignature=[self-parameterStrNoSignature];
NSLog(@“无签名参数:\n%@”,parameterNoSignature);
NSString*baseStringEncode=[NSString stringWithFormat:@“GET&%@&%@”,
[自宿主代码:kOauthGetRequestToken],
[自参数编码:参数签名]
];
NSLog(@“基本字符串编码:\n%@”,基本字符串编码);
NSString*signatureStr=[self-hmac_-sha1:koAuthConsumerCret
文本:baseStringEncode];
NSLog(@“签名:\n%@”,signatureStr);
NSString*urlStr=[NSString stringWithFormat:@“%@?%@&%@%@”,
kOauthGetRequestToken,
参数签名,
Koauth签名,
签名者
];
NSLog(@“url字符串:\n%@”,urlStr);
}
//实现viewDidLoad以在加载视图(通常从nib)后执行附加设置。
-(无效)viewDidLoad{
[超级视图下载];
[自我测试];
}
-(无效)解除锁定{
[super dealoc];
}

对于密钥,您需要[在伪代码中]:urlencode(utf8(oauth_consumer_secret))+“&”+urlencode(utf8(oauth_token_secret))


仅仅使用oauth_consumer_机密是不够的。如果oauth_token_secret是空的,就像它将在oauth进程开始时一样,该部分将是空的,但是您仍然需要在编码的使用者机密后面加上“&”。

对于密钥,您需要[在伪代码中]:urlencode(utf8(oauth_consumer_secret))+“&”+urlencode(utf8(oauth_token_secret))


仅仅使用oauth_consumer_机密是不够的。如果oauth\u token\u secret是空的,就像在oauth进程开始时一样,该部分将是空的,但您仍然需要遵循已编码的消费者机密。

很抱歉,页面看起来很难看,我不知道如何修复它。很抱歉,页面看起来很难看,我不知道如何修复它。谢谢,您说得对!但我很奇怪谷歌没有指出这一点。谢谢,你说得对!但我很奇怪谷歌没有指出这一点。
#import "ContactTestViewController.h"
#import "ASIHTTPRequest.h"
#import <CommonCrypto/CommonHMAC.h>
#import <CommonCrypto/CommonCryptor.h>
#import "Base64.h"
#import "NSStringAdditions.h"
#import "NSData+Base64.h"
#define kAllContacts @"https://www.google.com/m8/feeds/contacts/default/full"

#define kOauthGetRequestToken @"https://www.google.com/accounts/OAuthGetRequestToken"

#define kOauthConsumerKey   @"oauth_consumer_key=***.net"
#define kOauthConsumerSecret        @"****/*****"
#define kOauthNonce @"oauth_nonce=457261624861626265724761686176"
#define kOauthSigMethod             @"oauth_signature_method=HMAC-SHA1"
#define kOauthSignature             @"oauth_signature="
#define kOauthTimeStamp             @"oauth_timestamp="
#define kOauthScope @"scope=https://www.google.com/m8/feeds/contacts/default/full"
#define kOauthCallback              @"oauth_callback=http://****.net/index.html"
#define kOauthVersion               @"oauth_version=1.0"
#define kXOauthDisplayname          @""

@implementation ContactTestViewController

- (NSString *)parameterStrNoSignature
{
NSDate *currentDate = [NSDate date];
NSTimeInterval timeInter = [currentDate timeIntervalSince1970];

NSString *str = [NSString stringWithFormat:@"%@&%@&%@&%@&%@%d&%@",
                 kOauthCallback,
                 kOauthConsumerKey,
                 kOauthNonce,
                 kOauthSigMethod,
                 kOauthTimeStamp,
                 (int)timeInter,
                 kOauthScope
                 ];

return str;
}

- (NSString *)hostEncode:(NSString *)str
{
NSString *str1 = [str stringByReplacingOccurrencesOfString:@":" withString:@"%3A"];
NSString *str2 = [str1 stringByReplacingOccurrencesOfString:@"/" withString:@"%2F"];

return str2;
}

- (NSString *)parameterEncode:(NSString *)str
{
NSString *str1 = [str  stringByReplacingOccurrencesOfString:@"/" withString:@"%252F"];
NSString *str2 = [str1 stringByReplacingOccurrencesOfString:@":" withString:@"%253A"];
NSString *str3 = [str2 stringByReplacingOccurrencesOfString:@"&" withString:@"%26"];
NSString *str4 = [str3 stringByReplacingOccurrencesOfString:@"=" withString:@"%3D"];
return str4;
}
- (NSString *)hmac_sha1:(NSString *)key text:(NSString*)plainText
{

const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [plainText cStringUsingEncoding:NSASCIIStringEncoding];

char cHMAC[CC_SHA1_DIGEST_LENGTH];

CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:CC_SHA1_DIGEST_LENGTH];
NSString *hash = [Base64 encode:HMAC];//base64 

hash = [HMAC base64EncodedString];
[HMAC release];
return hash;
}

- (void)authTest
{
NSString *parameterNoSignature = [self parameterStrNoSignature];
NSLog(@"no signature parameters:\n%@",parameterNoSignature);
NSString *baseStringEncode = [NSString stringWithFormat: @"GET&%@&%@",
                              [self      hostEncode:kOauthGetRequestToken],
                              [self parameterEncode:parameterNoSignature]
                              ];

NSLog(@"base string encode:\n%@",baseStringEncode);

NSString *signatureStr = [self hmac_sha1:kOauthConsumerSecret 
                                    text:baseStringEncode];
NSLog(@"signature:\n%@",signatureStr);



NSString *urlStr = [NSString stringWithFormat:@"%@?%@&%@%@",
                    kOauthGetRequestToken,
                    parameterNoSignature,
                    kOauthSignature,
                    signatureStr
                ];
NSLog(@"url string:\n%@",urlStr);
}

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
 [super viewDidLoad];

[self authTest];
}

- (void)dealloc {
[super dealloc];
}