2013-08-24 101 views
0

我正在建立一個帶有rails支持服務器的iphone應用程序。我正在使用設計寶石。我在客戶端的用戶登錄時遇到了問題(一切工作在網絡端,甚至在使用CURL的終端上)。 在Xcode上我可以創建一個用戶,我可以登錄。登錄後iOS用戶登錄會話通過設計但Auth_token不保留

(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:@"https://stackoverflow.com/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實現?由於它是由devise自動生成的 - 我不知道如何告訴xcode記住它。 auth_token是一個在db上的用戶表中有一列的字符串。我應該將auth_token作爲param添加到保存用戶電子郵件和用戶名的字典中嗎?或者我如何讓令牌繼續存在? 任何想法都會有所幫助。

回答

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:@"https://stackoverflow.com/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); 
            } 
           }]; 
}