我有一個Rails應用程序,我正在設計iOS應用程序。 Rails應用程序使用Devise進行用戶登錄。當用戶通過移動應用程序登錄時,Rails應用程序應返回一個身份驗證令牌,然後在整個應用程序中使用該令牌。使用Rails應用程序+設計iOS登錄問題設計
我已經有一個工作的Android應用程序,我跟着這個頁面上的教程通過Android應用啓用登錄:
這是我的自定義設計SessionsController樣子:
class SessionsController < Devise::SessionsController
skip_before_filter :verify_authenticity_token,
:if => Proc.new { |c| c.request.format == 'application/json' }
warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#failure")
render :status => 200,
:json => { :success => true,
:info => "Logged in",
:data => { :auth_token => current_user.authentication_token } }
end
end
這一直對我的Android應用程序有效。
但我在使用我的iOS應用程序登錄時遇到了一個奇怪的問題。以下是我的登錄名:
-(IBAction)authenticateUser {
[keychainItem resetKeychainItem]; // remove any existing auth_token
NSURL *url=[NSURL URLWithString:sessionsBaseURL];
NSError *error = nil;
NSDictionary * userDict = [[NSDictionary alloc] initWithObjectsAndKeys: [_txtUsername text], @"username", [_txtPassword text], @"password", nil];
NSDictionary * holderDict = [[NSDictionary alloc] initWithObjectsAndKeys: userDict, @"user", nil];
NSLog(@"holderDict: %@", holderDict);
NSData * holder = [NSJSONSerialization dataWithJSONObject:holderDict options:0 error:&error];
NSLog(@"auth_token%@", [keychainItem objectForKey:(__bridge id)(kSecAttrType)]);
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:holder];
NSURLResponse * response = nil;
NSData * receivedData = nil;
receivedData = [NSMutableData data];
receivedData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSLog(@"attempting login");
// get dictionary from json data
NSDictionary * jsonResponse = [NSJSONSerialization
JSONObjectWithData: receivedData
options:kNilOptions
error:&error];
if(error == nil){
NSLog(@"successful login");
[keychainItem setObject:[_txtUsername text] forKey:(__bridge id)(kSecAttrAccount)];
NSLog(@"jsonResponse: %@", jsonResponse);
NSDictionary * dataResponse = [jsonResponse objectForKey:@"data"];
auth_token = [dataResponse objectForKey:@"auth_token"];
// save user authentication token
[keychainItem setObject:auth_token forKey:(__bridge id)(kSecValueData)];
}else{
NSLog(@"jsonResponse: %@", jsonResponse);
}
NSLog(@"error: %@" , [error localizedDescription]);
[self checkLoginApproved];
}
用戶能夠在第一次正確登錄並返回正確的身份驗證令牌。但是,如果用戶註銷然後在iOS應用程序中使用不正確的密碼重新登錄,Rails應用程序似乎認爲用戶已正確登錄(它不會返回未經授權的用戶,並且它會返回空認證令牌) 。
這使我相信warden.authenticate有問題。在Rails應用程序或iOS應用程序中,我很難找出問題所在。
有沒有人有一個讓他們的iOS應用程序使用Rails和設計用戶登錄的例子?還是有人有其他的想法,爲什麼我有什麼不工作?