无法使用访问令牌创建Facebook用户

时间:2013-01-02 11:02:49

标签: objective-c facebook parse-platform stackmob

我正在编写一个方法,从Parse上的db获取facebook用户记录,然后在StackMob上重新创建记录。当我调用createUserWithFacebookToken时,它会返回以下错误:

  

[48887:c07]错误域= HTTP代码= 401“操作不能   完成。 (HTTP错误401.)“UserInfo = 0xa6a9e60 {error =登录失败:   }

- (IBAction)fetchAllUsers:(id)sender {
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://api.parse.com/1/users/"]];
    [request setValue:@"XXXX" forHTTPHeaderField:@"X-Parse-Application-Id"];
    [request setValue:@"XXXX" forHTTPHeaderField:@"X-Parse-Master-Key"];

    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    NSLog(@"didReceiveResponse");
    [self.responseData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.responseData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"didFailWithError");
    NSLog(@"Connection failed: %@", [error description]);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"connectionDidFinishLoading");
    NSLog(@"Succeeded! Received %d bytes of data",[self.responseData length]);

    // convert to JSON
    NSError *myError = nil;
    NSDictionary *res = [NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:&myError];
    NSArray *allUsers = [res objectForKey:@"results"];
    // show all values
    for (int i=0;i<allUsers.count;i++) {
        id value = [allUsers objectAtIndex:i];
        NSString *username = [value objectForKey:@"username"];
        NSDictionary *authData = [value objectForKey:@"authData"];
        NSDictionary *facebook = [authData objectForKey:@"facebook"];
        NSString *accessToken = [facebook objectForKey:@"access_token"];
        if (accessToken) {
            NSDictionary *aUser = [NSDictionary dictionaryWithObjectsAndKeys:accessToken, @"accessToken", username, @"username", nil];
//            [_userInfo addObject:aUser];

            NSLog(@"%@", aUser);
            [self processTheUser:aUser];
        }
    }
}

- (void)processTheUser:(NSDictionary *)user {
    [self.client createUserWithFacebookToken:[user valueForKey:@"accessToken"] username:[user valueForKey:@"username"] onSuccess:^(NSDictionary *result) {
        NSLog(@"%@", result);
    } onFailure:^(NSError *error) {
        NSLog(@"%@", error);
    }];
}

3 个答案:

答案 0 :(得分:2)

错误401对应于stackmob错误代码SMErrorUnauthorized。当用户已经存在于stackmob上时,我发现你在调用createUserWithFacebookToken时得到了这个响应,所以在我的错误处理程序中我调用了loginWithFacebookToken。如果此调用也失败,那么我尝试使用facebook重新授权...

[FBSession.activeSession closeAndClearTokenInformation];
[[FBSession class] performSelector:@selector(renewSystemAuthorization)];
[FBSession openActiveSessionWithReadPermissions:nil
                                   allowLoginUI:YES
                              completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {

并在完成处理程序中成功再次调用createUserWithFacebookToken。

答案 1 :(得分:1)

线索出现错误:

facebook token already registered for another user

我对StackMob并不完全熟悉,但我使用Parse很多:我认为像Parse一样,StackMob不会让你创建两个具有相同Facebook凭据的用户。这是有道理的,因为否则使用您的Facebook帐户进行单点登录将无法正常工作!

所以可能发生的事情是你已经有一个用户链接到StackMob中的Facebook帐户,并且它不会让你添加另一个。在尝试创建用户之前,您可能需要添加条件测试以检查用户是否已存在于StackMob中。

答案 2 :(得分:1)

问题解决了! 我正在处理过期access_token的用户。我只是得到有效的,一切都好!