2013-10-14 36 views
3

我正在编写一个iOS应用程序,它可以提取Withings数据并使用simple-oauth1中的代码(我以前曾成功地使用过与Fitbit API交谈的代码)。我成功获取了一个请求令牌,对其进行了身份验证,然后获得了一个访问令牌。然后,我继续确保通过向http://wbsapi.withings.net/once?action=probe发送经过验证的GET请求来设置访问受保护资源的基础。我得到了一个错误代码0(一切似乎都在正常工作......) 但是,当我尝试进行任何其他调用http://wbsapi.withings.net,我遇到了错误250(“提供的用户标识和/或Oauth凭证不匹配”)。Withings API - 访问受保护的资源

下面是代码的样子:

- (void)getUserInfo 
{ 
    NSString *path = @"measure"; 
    NSMutableDictionary *moreParams = [[NSMutableDictionary alloc] init]; 
    [moreParams setValue:@"getmeas" forKey:@"action"]; 
    [moreParams setValue:@"1234567" forKey:@"userid"]; 

    NSURLRequest *preparedRequest = [OAuth1Controller preparedRequestForPath:path 
                   parameters:moreParams 
                   HTTPmethod:@"GET" 
                   oauthToken:self.oauthToken 
                    oauthSecret:self.oauthTokenSecret]; 

[NSURLConnection sendAsynchronousRequest:preparedRequest 
            queue:NSOperationQueue.mainQueue 
         completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
          dispatch_async(dispatch_get_main_queue(), ^{ 

           if (error) NSLog(@"Error in API request: %@", error.localizedDescription); 
          }); 
         }]; 
} 

这是怎样的请求被格式化(在OAuth1Controller.m基督徒的代码):

+ (NSURLRequest *)preparedRequestForPath:(NSString *)path 
          parameters:(NSDictionary *)queryParameters 
          HTTPmethod:(NSString *)HTTPmethod 
          oauthToken:(NSString *)oauth_token 
         oauthSecret:(NSString *)oauth_token_secret 
{ 
    if (!HTTPmethod 
    || !oauth_token) return nil; 

NSMutableDictionary *allParameters = [self standardOauthParameters].mutableCopy; 

allParameters[@"oauth_token"] = oauth_token; 

if (queryParameters) { 
    [allParameters addEntriesFromDictionary:queryParameters]; 
} 

NSString *parametersString = CHQueryStringFromParametersWithEncoding(allParameters, NSUTF8StringEncoding); 

NSString *request_url = API_URL; 
if (path) request_url = [request_url stringByAppendingString:path]; 
NSString *oauth_consumer_secret = CONSUMER_SECRET; 
NSString *baseString = [HTTPmethod stringByAppendingFormat:@"&%@&%@", request_url.utf8AndURLEncode, parametersString.utf8AndURLEncode]; 
NSString *secretString = [oauth_consumer_secret.utf8AndURLEncode stringByAppendingFormat:@"&%@", oauth_token_secret.utf8AndURLEncode]; 

NSString *oauth_signature = [self.class signClearText:baseString withSecret:secretString]; 

allParameters[@"oauth_signature"] = oauth_signature; 
allParameters[@"oauth_signature_method"] = @"HMAC-SHA1"; 

NSString *queryString; 

if (queryParameters) { 
    queryString = CHQueryStringFromParametersWithEncoding(queryParameters, NSUTF8StringEncoding); 
} 
if (queryString) { 
    request_url = [request_url stringByAppendingFormat:@"?%@", queryString]; 
} 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:request_url]]; 
request.HTTPMethod = HTTPmethod; 

NSMutableArray *parameterPairs = [NSMutableArray array]; 
[allParameters removeObjectsForKeys:queryParameters.allKeys]; 

for (NSString *name in allParameters) { 
    NSString *aPair = [name stringByAppendingFormat:@"=\"%@\"", [allParameters[name] utf8AndURLEncode]]; 
    [parameterPairs addObject:aPair]; 
} 

NSString *oAuthHeader = [@"OAuth " stringByAppendingFormat:@"%@", [parameterPairs componentsJoinedByString:@","]]; 
[request setValue:oAuthHeader forHTTPHeaderField:@"Authorization"]; 

return request; 
} 

我敢肯定,我有正确的用户标识符(在这里编辑为“1234567”),但我不确定为什么我不能用它来提取数据。我有一种感觉,这就是代码打破的地方。请帮忙。

+0

任何机会,你可以发布你使用simple-oauth1成功验证Withings的代码吗?我可以让登录页面出现,但是当我尝试输入我的凭据时,它只是重新加载登录页面,而不是将我带到授权页面。 – bmueller

回答