2

私は、ParseのデータベースからFacebookユーザーレコードを取得し、StackMobでレコードを再作成するメソッドを作成しています。createUserWithFacebookTokenを呼び出すと、次のエラーが返されます。

[48887:c07]エラードメイン=HTTPコード=401 "操作を完了できませんでした。(HTTPエラー401)" UserInfo = 0xa6a9e60 {エラー=ログインに失敗しました:}

- (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);
    }];
}
4

3 に答える 3

2

エラー401はstackmobエラーコードに対応しますSMErrorUnauthorizedcreateUserWithFacebookTokenユーザーがstackmobに既に存在する場合の呼び出しでこの応答を受け取ることがわかったので、エラーハンドラーで。を呼び出しますloginWithFacebookToken。この呼び出しも失敗した場合は、Facebookで再承認を試みます...

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

完了ハンドラーで成功したら、createUserWithFacebookTokenを再度呼び出します。

于 2013-01-03T06:08:38.433 に答える
1

手がかりはエラーにあります:

facebook token already registered for another user

私はStackMobに完全には精通していませんが、Parseをよく使用します。Parseのように、StackMobでは同じFacebookクレデンシャルを持つ2人のユーザーを作成できないと思います。そうしないと、Facebookアカウントでのシングルサインオンが機能しないため、これは理にかなっています。

つまり、おそらく何が起こっているのかというと、StackMobにそのFacebookアカウントにリンクされているユーザーがすでにいて、別のアカウントを追加することはできません。条件付きテストを追加して、ユーザーを作成する前に、ユーザーがStackMobに既に存在するかどうかを確認することをお勧めします。

于 2013-01-02T11:07:13.823 に答える
1

問題が解決しました!期限切れのaccess_tokenを持つユーザーに取り組んでいました。私は単に有効なものを手に入れて、すべて大丈夫です!

于 2013-01-05T20:35:10.247 に答える