0

我正在构建一个带有 rails 支持的服务器的 iphone 应用程序。我正在使用设计宝石。我在客户端用户登录时遇到问题(一切都在 Web 端运行,甚至在带有 CURL 的终端中)。在 Xcode 上,我可以创建一个用户并且可以登录。登录后

(and recieving this in the log: "User logged in!")

然后我被推送到 indexViewController- 在这里我收到一个帖子没有加载的错误。原因是因为在 post_controller.rb 我有一个

before_filter :authenticate_user!

防止帖子加载。问题是,成功登录时生成的 auth_token 没有被存储并传递给不同的视图。那么,在日志中我得到:

'You need to sign in before continuing.'

好像我刚才解释的第一部分从未发生过一样。

在 indexViewController viewDidLoad 方法中,我有:

if (![[APIClient sharedClient] isAuthorized]) {
        LoginViewController *loginViewController = [[LoginViewController alloc] init];
        [self.navigationController pushViewController:loginViewController animated:YES];
    }

isAuthorized 是 APIClient 中的一个 BOOL,用于检查 userID>0

在用户模型中,这是创建登录会话的代码

+ (void)loginUser:(NSString *)signature
                         email:(NSString *)email
                      password:(NSString *)password
                         block:(void (^)(User *user))block
{
    NSDictionary *parameters = @{ @"user": @{
                                    //      @"signature": signature,
                                          @"email": email,
                                          @"password": password
                                          }
                                  };

    [[APIClient sharedClient] postPath:@"/users/sign_in" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
        User *user = [[User alloc] initWithDictionary:responseObject];

        if (block) {
            block(user);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
        if (block) {
            block(nil);
        }
    }];
}

我猜我在这里缺少一些 auth_token 实现?由于它是由设计自动生成的-我不确定如何告诉 xcode 记住它。auth_token 是一个字符串,在数据库的用户表中有一个列。我应该将 auth_token 作为参数添加到保存用户电子邮件和用户名的字典中吗?或者我如何让令牌持久存在?任何想法都会有所帮助。

4

1 回答 1

0

对 AFNetworking 不熟悉,这是在黑暗中的尝试,但大概您需要为后续请求设置令牌。假设 APIClient 是您在 AFHTTPClient 周围添加的包装器,在查看此处的代码 - AFHTTPClient后,可以快速了解它的外观。

+ (void)loginUser:(NSString *)signature
                         email:(NSString *)email
                      password:(NSString *)password
                         block:(void (^)(User *user))block {
    NSDictionary *parameters = @{ @"user": @{ @"email": email,
                                              @"password": password } };

    [[APIClient sharedClient] postPath:@"/users/sign_in" 
                            parameters:parameters 
                               success:^(AFHTTPRequestOperation *operation, id responseObject) {
                                   User *user = [[User alloc] initWithDictionary:responseObject];

                                   // retrieve and save auth token
                                   NSString *token = [responseObject objectForKey:@"authToken"];
                                   [[APIClient sharedClient] setAuthorizationHeaderWithToken:token];

                                   if (block) {
                                       block(user);
                                   }

                               } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                   NSLog(@"Error: %@", error);
                                   if (block) {
                                       block(nil);
                                   }
                               }];
}
于 2013-08-25T02:30:32.037 回答