IOS登录-这个代码是正确的/安全的?如何查看用户是否已登录?


IOS login - is this code correct/secure? How can I check if the user is already logged in?

我想做一个iphone应用程序,有一个loginViewController。这个代码是正确和安全的吗?

-(IBAction)loginPressed:(id)sender{

NSString *usr = [[NSString alloc]init];
NSString *psw = [[NSString alloc]init];
usr = username.text;
psw = password.text;
NSLog(@"%@",usr);
NSLog(@"%@", psw);
NSString *URL = [NSString stringWithFormat:@"http://www.mywebsite.com/loginApp.php?user_name=%@&password=%@", usr, psw];
NSLog(@"%@", URL);
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:URL]];
NSString *Result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

if ([Result isEqualToString:@"1"])
{
    NSLog(@"logged in");

}else if ([Result isEqualToString:@"2"]){
    UIAlertView *WrongCredential = [[UIAlertView alloc]initWithTitle:@"Loggin failed" message:@"sorry, check again your email and password" delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles: nil];
    [WrongCredential show];
}
}

loginApp.php

<?php 
 require_once 'functions/init.php';
if (isset($_GET['user_name'], $_GET['password'])){
$email = sanitize($_GET['user_name']);
$password = sanitize($_GET['password']);
$login = loginApp($email, $password);
if($login === true){
    echo json_encode(1);
                       }
    else if($login === false){
    echo json_encode(2);
    }
   }
   ?>

如何查看用户是否已经登录?在php中,我可能会设置session/cookies ?我如何用Objective C做到这一点?

NSString *usr = [[NSString alloc]init];
NSString *psw = [[NSString alloc]init];
usr = username.text;
psw = password.text;

这段代码造成内存泄漏。您不必分配字符串并从标签后检索它,只需将其替换为:

NSString* usr = username.text;
NSString* psw = password.text;

然后,您将密码清楚地传递给您的网站。您可以在非https协议和GET方法上进行此操作。

  1. 发送到web前加密密码
  2. 使用POST方法进行登录
  3. 如果可能的话,让你的网站使用HTTPS协议。
然后,在这段代码中:
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:URL]];

从主线程以同步模式呼叫web。所以你的UI会在web服务没有响应时被阻塞。这不是一个好的做法。在异步模式下这样做会更好。

如果你不熟悉NSURLConnection和它的异步模式,我会推荐你AFNetworking,这是目前最好的REST库。

对于保存用户名和密码,我个人建议使用Keychain,因为它们在安全性方面比NSUserDefault更安全,因为Keychain以加密形式存储数据,而NSUserDefault存储为纯文本。您可以查看:https://github.com/carlbrown/PDKeychainBindingsController

保持一个标志或变量(例如bool - isUserLoggedIn)。默认值为NO,且在

if ([Result isEqualToString:@"1"])
{
    NSLog(@"logged in");
    isUserLoggedIn = YES;

}else if ([Result isEqualToString:@"2"]){
    UIAlertView *WrongCredential = [[UIAlertView alloc]initWithTitle:@"Loggin failed" message:@"sorry, check again your email and password" delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles: nil];
    [WrongCredential show];
    isUserLoggedIn = NO;
}

现在你可以随时检查这个标志值(isUserLoggedIn)

希望这是你正在寻找的

如果你想在应用程序启动之间保存用户状态,你可能需要在NSUserDefaults中设置value。

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"UserLogged"];

你可以检查这个标志

if ([[NSUserDefaults standardUserDefaults] boolForKey:@"UserLogged"]) {}

或者保存用户名和密码

你也可以看看parse.com的基本注册/登录功能