Skip to content

Instantly share code, notes, and snippets.

@YarGnawh
Last active May 19, 2017 15:10
Show Gist options
  • Save YarGnawh/10a4ee306578d9aceb28 to your computer and use it in GitHub Desktop.
Save YarGnawh/10a4ee306578d9aceb28 to your computer and use it in GitHub Desktop.
Twitter Reverse Auth API Request
- (void)reserveAuth
{
NSString * http_method = @"POST";
NSString * request_url = @"https://api.twitter.com/oauth/request_token";
NSString * oauth_consumer_key = @"bcn3PUKI0PZoxfPTqEDkMru9A";
NSString * oauth_consumer_secret = @"YiVeSteQBplk8xzAtuoulA7i2vLkVF5kIwc5x1A6ZaxmugdmXg";
NSString * oauth_nonce = [[NSUUID UUID] UUIDString];
NSString * oauth_signature = @"";
NSString * oauth_signature_method = @"HMAC-SHA1";
NSString * oauth_timestamp = [NSString stringWithFormat:@"%.0f", [[NSDate date] timeIntervalSince1970]];
NSString * oauth_version = @"1.0";
NSString * x_auth_mode = @"reverse_auth";
NSMutableString *parameter_string = [NSMutableString string];
[parameter_string appendFormat:@"oauth_consumer_key=%@&", oauth_consumer_key];
[parameter_string appendFormat:@"oauth_nonce=%@&", oauth_nonce];
[parameter_string appendFormat:@"oauth_signature_method=%@&", oauth_signature_method];
[parameter_string appendFormat:@"oauth_timestamp=%@&", oauth_timestamp];
[parameter_string appendFormat:@"oauth_token=&"];
[parameter_string appendFormat:@"oauth_version=%@&", oauth_version];
[parameter_string appendFormat:@"x_auth_mode=%@", x_auth_mode];
NSMutableString * signature_base_string = [NSMutableString string];
[signature_base_string appendFormat:@"%@", http_method];
[signature_base_string appendString:@"&"];
[signature_base_string appendFormat:@"%@", [self percentEncodeString:request_url]];
[signature_base_string appendString:@"&"];
[signature_base_string appendFormat:@"%@", [self percentEncodeString:parameter_string]];
NSString * signing_key = [NSString stringWithFormat:@"%@&", [self percentEncodeString:oauth_consumer_secret]];
const char *cKey = [signing_key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [signature_base_string cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
oauth_signature = [[[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)] base64EncodedStringWithOptions:0];
NSMutableString *header = [NSMutableString stringWithString:@"OAuth "];
[header appendFormat:@"oauth_consumer_key=\"%@\", ", oauth_consumer_key];
[header appendFormat:@"oauth_nonce=\"%@\", ", oauth_nonce];
[header appendFormat:@"oauth_signature=\"%@\", ", [self percentEncodeString:oauth_signature]];
[header appendFormat:@"oauth_signature_method=\"%@\", ", oauth_signature_method];
[header appendFormat:@"oauth_timestamp=\"%@\", ", oauth_timestamp];
[header appendFormat:@"oauth_token=\"%@\", ", @""];
[header appendFormat:@"oauth_version=\"%@\"", oauth_version];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager setRequestSerializer:[[AFHTTPRequestSerializer alloc] init]];
[manager setResponseSerializer:[[AFHTTPResponseSerializer alloc] init]];
[[manager requestSerializer] setValue:header forHTTPHeaderField:@"Authorization"];
[[manager responseSerializer] setAcceptableContentTypes:[NSSet setWithObject:@"text/html"]];
[manager POST:request_url parameters:@{@"x_auth_mode": @"reverse_auth"} success:^(NSURLSessionDataTask *task, id responseObject)
{
NSString *string_value = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSDictionary *step2Params = [[NSMutableDictionary alloc] init];
[step2Params setValue:oauth_consumer_key forKey:@"x_reverse_auth_target"];
[step2Params setValue:string_value forKey:@"x_reverse_auth_parameters"];
NSURL *url2 = [NSURL URLWithString:@"https://api.twitter.com/oauth/access_token"];
SLRequest *stepTwoRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter
requestMethod:SLRequestMethodPOST
URL:url2
parameters:step2Params];
ACAccountStore *accountStore = [[AccountManager sharedManager] accountStore];
ACAccount *twitterAccount = [[accountStore accounts] firstObject];
[stepTwoRequest setAccount:twitterAccount];
[stepTwoRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
NSString *responseStr = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
[[AFHTTPSessionManager manager] POST:@"http://localhost:3000/user/connect/twitter"
parameters:@{@"device": [[[UIDevice currentDevice] identifierForVendor] UUIDString],
@"account": @"twitter",
@"info": responseStr}
success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"%@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"%@", error);
}];
}];
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"%@", error);
}];
}
- (NSString *)percentEncodeString:(NSString *)string
{
CFStringRef charactersToLeaveUnescaped = CFSTR(" ");
CFStringRef legalURLCharactersToBeEscaped = CFSTR("!$&'()+,/:;=?@~");
NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
kCFAllocatorDefault,
(__bridge CFStringRef)string,
charactersToLeaveUnescaped,
legalURLCharactersToBeEscaped,
kCFStringEncodingUTF8));
return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}
@cap3618
Copy link

cap3618 commented Aug 18, 2014

I don't know how to make request token.
Please help me.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment