2014-06-05 76 views
1

我有一个iOS应用程序,通过OAuth 2.0与Google Plus API进行身份验证。我遇到的问题是,即使我完全按照Google文档进行操作,但仍无法发布自己的时刻。这里是我的POST请求:无法插入时刻 - Google Plus API

NSString *gp_moment = [NSString stringWithFormat:@"https://www.googleapis.com/plus/v1/people/me/moments/vault?access_token=%@", token_gplus]; 
     NSString *urlString = gp_moment; 

     NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
     [request setURL:[NSURL URLWithString:urlString]]; 
     [request setHTTPMethod:@"POST"]; 

     // Set the header - Content-Type. 
     NSDictionary *the_header = @{@"Content-type" : @"application/json", 
            @"userId" : @"me", 
            @"collection" : @"vault", 
            @"requestvisibleactions" : @"http://schemas.google.com/AddActivity"}; 

     [request setAllHTTPHeaderFields:the_header]; 

     // Set the metadata for the GP Moment (eg: name). - request_visible_actions 

     NSDictionary *metadata = @{@"target" : @{ 
              @"id" : @"replacewithuniqueidforaddtarget", 
              @"image" : @"http://www.google.com/s2/static/images/GoogleyEyes.png", 
              @"type": @"http://schema.org/CreativeWork", 
              @"description" : @"test_desc", 
              @"name" : @"TESTNAME", 
              }, 
            @"type" : @"http://schemas.google.com/AddActivity"}; 

     // Convert metadata into JSON format and submit. 
     NSError *jError = nil; 
     NSData *jsonData = [NSJSONSerialization dataWithJSONObject:metadata options:NSJSONWritingPrettyPrinted error:&jError]; 
     [request setHTTPBody:jsonData]; 

     NSHTTPURLResponse *response = nil; 
     NSError *error = nil; 

     NSData *returnedData; 
     returnedData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
     NSDictionary *headers = [response allHeaderFields]; 

     NSLog(@"DATA: %@", [[NSString alloc] initWithData:returnedData encoding:NSASCIIStringEncoding]); 
     NSLog(@"%@", headers); 
     NSLog(@"%@", response); 
     NSLog(@"%@", error); 

更新 - 如何我对使用谷歌提供的GTMOAuth2的iOS库使用OAuth令牌

我得到令牌。它有我使用的4个主要类别:

The GTMOAuth2 Library files

这是我从类实现到我的ViewController代码:

-(GTMOAuth2Authentication *)begin_authorization { 

// Set the token URL to the token endpoint. 
NSURL *tokenURL; 

// Set a bogus redirect URI. It won't actually be used as the redirect will 
// be intercepted by the OAuth library and handled in the app. 
NSString *redirectURI; 

GTMOAuth2Authentication *auth; 
tokenURL = [NSURL URLWithString:@"https://accounts.google.com/o/oauth2/token"]; 
redirectURI = @"http://localhost:3000/oauth/callback/"; 

    auth = [GTMOAuth2Authentication authenticationWithServiceProvider:@"GooglePlus" tokenURL:tokenURL redirectURI:redirectURI clientID:kMyClientID_gplus clientSecret:kMyClientSecret_gplus]; 
[auth setScope:@"https://www.googleapis.com/auth/plus.login"]; 

// Set the appropriate token type. 
[auth setTokenType:@"Bearer"]; 

return auth; 
} 

-(void)authorize:(NSString *)service { 
    GTMOAuth2Authentication *auth = [self begin_authorization]; 

// Prepare the Authorization URL. We will pass in the name of the service 
// that we wish to authorize with. 
NSURL *authURL; 
authURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://accounts.google.com/o/oauth2/auth/"]]; 

NSString *keyname; 
keyname = [NSString stringWithFormat:@"GooglePlus"]; 

// Display the authentication view 
GTMOAuth2ViewControllerTouch *viewController; 
viewController = [[GTMOAuth2ViewControllerTouch alloc] initWithAuthentication:auth authorizationURL:authURL keychainItemName:keyname delegate:self finishedSelector:@selector(viewController:finishedWithAuth:error:)]; 

[viewController setBrowserCookiesURL:[NSURL URLWithString:@"https://accounts.google.com/o/oauth2/auth/"]]; 

// Push the authentication view to our navigation controller instance 
[[self navigationController] pushViewController:viewController animated:YES]; 
} 

-(void)viewController:(GTMOAuth2ViewControllerTouch *)viewController finishedWithAuth:(GTMOAuth2Authentication *)auth error:(NSError *)error { 

if (error != nil) { 
    // Authentication failed 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Authorization Failed" message:[error localizedDescription] delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil]; 
    [alertView show]; 
} 

else { 
    // Authentication succeeded 
    // Assign the access token to the instance property for later use 

    account_check = auth.accessToken; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:account_check forKey:@"gp_token"]; 
    [defaults synchronize]; 
} 
} 

在GTMOAuth2SignIn.m文件我也设置的offline_access和 “requestvisisbleactions” 参数,如下所示:

NSMutableDictionary *paramsDict = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
           @"code", @"response_type", 
           clientID, @"client_id", 
           scope, @"scope", // scope may be nil 
           @"force", @"approval_prompt", 
           @"offline", @"access_type", 
           @"http://schemas.google.com/AddActivity", @"requestvisibleactions", 
           nil]; 

UPDATE - 2

我尝试过浏览所有Google Plus文档以及查看“requestvisisbleactions”和“request_visisble_actions”之间的差异,但仍然无效。有谁知道什么是错的?

更新 - 3 - 我仍然得到

的错误我一直在从谷歌加API收到此错误。我只是不知道为什么...:

{ 
"error": { 
    "errors": [ 
    { 
    "domain": "global", 
    "reason": "unauthorized", 
    "message": "Unauthorized" 
    } 
    ], 
    "code": 401, 
    "message": "Unauthorized" 
} 
} 
+1

它报告什么错误? – Prisoner

+0

@Prisoner我收到错误“401未经授权”。但事情是,如果摆脱JSON身体或只是编辑它,我不会再遇到这个错误。更重要的是,我的访问令牌全部正确设置。 – Supertecnoboff

+0

@Prisoner你知道什么可能是错的吗? – Supertecnoboff

回答

4

我相信你需要使用request_visible_actions。所以你的参数可能被设置为

NSMutableDictionary *paramsDict = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
            @"code", @"response_type", 
            clientID, @"client_id", 
            scope, @"scope", // scope may be nil 
            @"force", @"approval_prompt", 
            @"offline", @"access_type", 
            @"http://schemas.google.com/AddActivity", @"request_visible_actions", 
            nil]; 
+0

刚刚尝试过,没有遗憾的是它仍然出现了未经授权的错误:(你能想到其他任何我可能做错了/没有做过的事情吗? – Supertecnoboff

+0

其实这最终确实有效。还有一些我不得不改变也是如此。你的先生也将得到赏金:) – Supertecnoboff

+0

谢谢!为了完整性,还需要什么? – Prisoner