· 7 years ago · Jan 12, 2018, 10:26 PM
1NSDictionary *OAuthorizationHeaderDictionary(NSURL *url, NSString *method, NSData *body, NSString *_oAuthConsumerKey, NSString *_oAuthConsumerSecret, NSString *_oAuthToken, NSString *_oAuthTokenSecret)
2{
3 NSString *_oAuthNonce = [NSString ab_GUID];
4 NSString *_oAuthTimestamp = [NSString stringWithFormat:@"%d", (int)[[NSDate date] timeIntervalSince1970]];
5 NSString *_oAuthSignatureMethod = @"HMAC-SHA1";
6 NSString *_oAuthVersion = @"1.0";
7
8 NSMutableDictionary *oAuthAuthorizationParameters = [NSMutableDictionary dictionary];
9 [oAuthAuthorizationParameters setObject:_oAuthNonce forKey:@"oauth_nonce"];
10 [oAuthAuthorizationParameters setObject:_oAuthTimestamp forKey:@"oauth_timestamp"];
11 [oAuthAuthorizationParameters setObject:_oAuthSignatureMethod forKey:@"oauth_signature_method"];
12 [oAuthAuthorizationParameters setObject:_oAuthVersion forKey:@"oauth_version"];
13 [oAuthAuthorizationParameters setObject:_oAuthConsumerKey forKey:@"oauth_consumer_key"];
14 if(_oAuthToken)
15 [oAuthAuthorizationParameters setObject:_oAuthToken forKey:@"oauth_token"];
16
17 // get query and body parameters
18 NSDictionary *additionalQueryParameters = [NSURL ab_parseURLQueryString:[url query]];
19 NSDictionary *additionalBodyParameters = nil;
20 if(body) {
21 NSString *string = [[[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding] autorelease];
22 if(string) {
23 additionalBodyParameters = [NSURL ab_parseURLQueryString:string];
24 }
25 }
26
27 // combine all parameters
28 NSMutableDictionary *parameters = [[oAuthAuthorizationParameters mutableCopy] autorelease];
29 if(additionalQueryParameters) [parameters addEntriesFromDictionary:additionalQueryParameters];
30 if(additionalBodyParameters) [parameters addEntriesFromDictionary:additionalBodyParameters];
31
32 // -> UTF-8 -> RFC3986
33 NSMutableDictionary *encodedParameters = [NSMutableDictionary dictionary];
34 for(NSString *key in parameters) {
35 NSString *value = [parameters objectForKey:key];
36 [encodedParameters setObject:[value ab_RFC3986EncodedString] forKey:[key ab_RFC3986EncodedString]];
37 }
38
39 NSArray *sortedKeys = [[encodedParameters allKeys] sortedArrayUsingFunction:SortParameter context:encodedParameters];
40
41 NSMutableArray *parameterArray = [NSMutableArray array];
42 for(NSString *key in sortedKeys) {
43 [parameterArray addObject:[NSString stringWithFormat:@"%@=%@", key, [encodedParameters objectForKey:key]]];
44 }
45 NSString *normalizedParameterString = [parameterArray componentsJoinedByString:@"&"];
46
47 NSString *normalizedURLString = [NSString stringWithFormat:@"%@://%@%@", [url scheme], [url host], [url path]];
48
49 NSString *signatureBaseString = [NSString stringWithFormat:@"%@&%@&%@",
50 [method ab_RFC3986EncodedString],
51 [normalizedURLString ab_RFC3986EncodedString],
52 [normalizedParameterString ab_RFC3986EncodedString]];
53 NSString *key = [NSString stringWithFormat:@"%@&%@",
54 [_oAuthConsumerSecret ab_RFC3986EncodedString],
55 [_oAuthTokenSecret ab_RFC3986EncodedString]];
56
57 NSData *signature = HMAC_SHA1(signatureBaseString, key);
58 NSString *base64Signature = [signature base64EncodedString];
59
60 NSMutableDictionary *authorizationHeaderDictionary = [[oAuthAuthorizationParameters mutableCopy] autorelease];
61 [authorizationHeaderDictionary setObject:base64Signature forKey:@"oauth_signature"];
62
63 return authorizationHeaderDictionary;
64}