2015-07-21 98 views
0

我已经成功地将Google+集成到我的iOS应用程序中。但随着最新的Apple商店更新,该应用程序不允许打开浏览器使用Safari浏览器启动Google身份验证,因此我尝试了uiwebview进行googleplus身份验证,并且获取访问令牌,但无法获取用户名和电子邮件地址人登录in.Below我加入我的消息来源,GooglePlus集成到ios

NSString *client_id = @"***************************";; 
NSString *secret = @"*******************************"; 
NSString *callbakc = @"https://www.example.com/oauth2callback";; 
NSString *scope = @"https://www.googleapis.com/auth/userinfo.email+https://www.googleapis.com/auth/userinfo.profile+https://www.google.com/reader/api/0/subscription"; 
NSString *visibleactions = @"http://schemas.google.com/AddActivity"; 

@interface MainViewController() 

@end 

@implementation MainViewController 
@synthesize webview,isLogin,isReader; 

- (void)viewDidLoad 
{ 
     [super viewDidLoad]; 


NSString *url = [NSString stringWithFormat:@"https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=%@&redirect_uri=%@&scope=%@&data-requestvisibleactions=%@",client_id,callbakc,scope,visibleactions]; 

[webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]]; 
} 
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType { 
// [indicator startAnimating]; 


NSLog(@"dgfduiussdiff %@ ",[[request URL] host]); 

if ([[[request URL] host] isEqualToString:@"www.example.com"]) { 

    // Extract oauth_verifier from URL query 
    NSString* verifier = nil; 
    NSArray* urlParams = [[[request URL] query] componentsSeparatedByString:@"&"]; 
    for (NSString* param in urlParams) { 
     NSArray* keyValue = [param componentsSeparatedByString:@"="]; 
     NSString* key = [keyValue objectAtIndex:0]; 
     if ([key isEqualToString:@"code"]) { 
      verifier = [keyValue objectAtIndex:1]; 
      NSLog(@"verifier %@",verifier); 
      break; 
     } 
    } 

    if (verifier) { 
     NSString *data = [NSString stringWithFormat:@"code=%@&client_id=%@&client_secret=%@&redirect_uri=%@&grant_type=authorization_code", verifier,client_id,secret,callbakc]; 
     NSString *url = [NSString stringWithFormat:@"https://accounts.google.com/o/oauth2/token"]; 
     NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]]; 
     [request setHTTPMethod:@"POST"]; 
     [request setHTTPBody:[data dataUsingEncoding:NSUTF8StringEncoding]]; 
     NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:request delegate:self]; 
     receivedData = [[NSMutableData alloc] init]; 

    } else { 
     // ERROR! 
    } 

    [webView removeFromSuperview]; 

    return NO; 
} 
return YES; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 

    { 
    NSError* error; 

[receivedData appendData:data]; 


NSDictionary* json = [NSJSONSerialization 
         JSONObjectWithData:receivedData 
         options:kNilOptions 
         error:&error]; 

NSLog(@"verifier %@",json); 



} 
      - (void)connection:(NSURLConnection *)connection didFailWithError:  (NSError *)error{ 
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" 
               message:[NSString stringWithFormat:@"%@", error] 
               delegate:nil 
             cancelButtonTitle:@"OK" 
             otherButtonTitles:nil]; 
    [alert show]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
NSString *response = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding]; 
SBJsonParser *jResponse = [[SBJsonParser alloc]init]; 
NSDictionary *tokenData = [jResponse objectWithString:response]; 
// WebServiceSocket *dconnection = [[WebServiceSocket alloc] init]; 
// dconnection.delegate = self; 

NSString *pdata = [NSString stringWithFormat:@"type=3&token=%@&secret=123&login=%@", [tokenData objectForKey:@"refresh_token"], self.isLogin]; 
// NSString *pdata = [NSString stringWithFormat:@"type=3&token=%@&secret=123&login=%@",[tokenData accessToken.secret,self.isLogin]; 
// [dconnection fetch:1 withPostdata:pdata withGetData:@"" isSilent:NO]; 


UIAlertView *alertView = [[UIAlertView alloc] 
          initWithTitle:@"Google Access TOken" 
          message:pdata 
          delegate:nil 
          cancelButtonTitle:@"OK" 
          otherButtonTitles:nil]; 
[alertView show]; 
} 

执行上面的源代码我得到在印刷的NSLog下面的响应后,

 verifier 4/kMcSZ2l-d_XXPo24NSdsMnugoP_MGDGPP4D5C1LRTfY 
     2015-07-21 18:04:16.103 TechnoGerms.com[8981:189233] verifier { 
    "access_token" =  "ya29.twG9kyMElyC8BgAxujF98WKN0BQ246Ey6zsKQEgSpKsNEb5JOS3QRl12La6XBy1geZnL"; 
"expires_in" = 3600; 
     "id_token" = "eyJhbGciOiJSUzI1NiIsImtpZCI6ImRhNjYyNWIzNmJjMDlkMzAwMzUzYjI4YTc0MWNlMTc1MjVhNGMzM2IifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwic3ViIjoiMTE0MjE4NDEwODI0NzM1ODkyMDg0IiwiYXpwIjoiMTY5NzY2MjI4OTY4LWtoNzI1dTFpZWdzNHN1bnFhOThhcHUxMHU4djhhcmFmLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiZW1haWwiOiJhcmp1bkBsaW5rd2FyZS5pbiIsImF0X2hhc2giOiJQVnJxTURpNDViZnVGTm9kTmlsSFlRIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImF1ZCI6IjE2OTc2NjIyODk2OC1raDcyNXUxaWVnczRzdW5xYTk4YXB1MTB1OHY4YXJhZi5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImhkIjoibGlua3dhcmUuaW4iLCJpYXQiOjE0Mzc0ODIwNTUsImV4cCI6MTQzNzQ4NTY1NX0.uSMrV8rOz4T4i5MhiCeQueNVGLv4NBLP-gtOcyow8t4BY9qvUO78sG4y0jPhbclPdX1kUZjzMVTeah2nU9fTYyl50dlj5FzWNy7LyM-a1GC2jEwkgWMgHdRPh6l7dqMrjQ9sU1rF-ZaiWfG7C9VJTJ76uEWRiSKKA9EFQtBil3xBtmDH07UMRxkbri2jBwaCPAWgjU8-dTarrxNESrwrO_nptaRzfGeaTyQBIYCAk6_9deXmblPgteER1OHoa65xb1OVK3ZPeZ3_dj9gjlXSyGp2ho5WIFGf2xRvW4XoROpUYqhLvrS3s-YrrZ8J5X5-3mafrs1qDjJYJogctbW7dg"; 
    "token_type" = Bearer; 
    } 

我怎样才能获得登录的用户名和电子邮件的人通过使用我得到的访问令牌?请提供任何建议,因为我没有得到任何解决方案在谷歌。

感谢您的支持

回答

0

,如果你想获取谷歌+用户的整个轮廓,可以用下面的URL

https://www.googleapis.com/plus/v1/people/me/?access_token={YOUR_ACCESS_TOKEN} 

然后调用GET方法。您将获得一个包含授权配置文件详细信息的数组。

另一种方法是,如果要存储授权用户的电子邮件,则其已存在于该字段中作为id_token。它是一些base64编码的数据,包含一些字段。如果解码ID哟将获得有关user.For例如,一些信息在您的结果发现id_token作为

eyJhbGciOiJSUzI1NiIsImtpZCI6ImRhNjYyNWIzNmJjMDlkMzAwMzUzYjI4YTc0MWNlMTc1MjVhNGMzM2IifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwic3ViIjoiMTE0MjE4NDEwODI0NzM1ODkyMDg0IiwiYXpwIjoiMTY5NzY2MjI4OTY4LWtoNzI1dTFpZWdzNHN1bnFhOThhcHUxMHU4djhhcmFmLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiZW1haWwiOiJhcmp1bkBsaW5rd2FyZS5pbiIsImF0X2hhc2giOiJQVnJxTURpNDViZnVGTm9kTmlsSFlRIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImF1ZCI6IjE2OTc2NjIyODk2OC1raDcyNXUxaWVnczRzdW5xYTk4YXB1MTB1OHY4YXJhZi5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImhkIjoibGlua3dhcmUuaW4iLCJpYXQiOjE0Mzc0ODIwNTUsImV4cCI6MTQzNzQ4NTY1NX0.uSMrV8rOz4T4i5MhiCeQueNVGLv4NBLP-gtOcyow8t4BY9qvUO78sG4y0jPhbclPdX1kUZjzMVTeah2nU9fTYyl50dlj5FzWNy7LyM-a1GC2jEwkgWMgHdRPh6l7dqMrjQ9sU1rF-ZaiWfG7C9VJTJ76uEWRiSKKA9EFQtBil3xBtmDH07UMRxkbri2jBwaCPAWgjU8-dTarrxNESrwrO_nptaRzfGeaTyQBIYCAk6_9deXmblPgteER1OHoa65xb1OVK3ZPeZ3_dj9gjlXSyGp2ho5WIFGf2xRvW4XoROpUYqhLvrS3s-YrrZ8J5X5-3mafrs1qDjJYJogctbW7dg 

以上id_token包含2份分离“”。第一部分是base64_encoded密钥,第二部分是元数据。

可以解码这两个数据作为

$key=base64_decode(eyJhbGciOiJSUzI1NiIsImtpZCI6ImRhNjYyNWIzNmJjMDlkMzAwMzUzYjI4YTc0MWNlMTc1MjVhNGMzM2IifQ) 

会给你钥匙

$data=base64_decode(eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwic3ViIjoiMTE0MjE4NDEwODI0NzM1ODkyMDg0IiwiYXpwIjoiMTY5NzY2MjI4OTY4LWtoNzI1dTFpZWdzNHN1bnFhOThhcHUxMHU4djhhcmFmLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiZW1haWwiOiJhcmp1bkBsaW5rd2FyZS5pbiIsImF0X2hhc2giOiJQVnJxTURpNDViZnVGTm9kTmlsSFlRIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImF1ZCI6IjE2OTc2NjIyODk2OC1raDcyNXUxaWVnczRzdW5xYTk4YXB1MTB1OHY4YXJhZi5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImhkIjoibGlua3dhcmUuaW4iLCJpYXQiOjE0Mzc0ODIwNTUsImV4cCI6MTQzNzQ4NTY1NX0.uSMrV8rOz4T4i5MhiCeQueNVGLv4NBLP-gtOcyow8t4BY9qvUO78sG4y0jPhbclPdX1kUZjzMVTeah2nU9fTYyl50dlj5FzWNy7LyM-a1GC2jEwkgWMgHdRPh6l7dqMrjQ9sU1rF-ZaiWfG7C9VJTJ76uEWRiSKKA9EFQtBil3xBtmDH07UMRxkbri2jBwaCPAWgjU8-dTarrxNESrwrO_nptaRzfGeaTyQBIYCAk6_9deXmblPgteER1OHoa65xb1OVK3ZPeZ3_dj9gjlXSyGp2ho5WIFGf2xRvW4XoROpUYqhLvrS3s-YrrZ8J5X5-3mafrs1qDjJYJogctbW7dg) 

会给你的元数据。

同时对数据进行解码,它会给结果作为

{"iss":"accounts.google.com","sub":"114218410824735892084","azp":"169766228968-kh725u1iegs4sunqa98apu10u8v8araf.apps.googleusercontent.com","email":"[email protected]","at_hash":"PVrqMDi45bfuFNodNilHYQ","email_verified":true,"aud":"169766228968-kh725u1iegs4sunqa98apu10u8v8araf.apps.googleusercontent.com","hd":"linkware.in","iat":1437482055,"exp":1437485655} 

上述结果可以发现提交的电子邮件。我希望这能帮到您。