【问题标题】:Pass username and password in URL for authentication在 URL 中传递用户名和密码以进行身份​​验证
【发布时间】:2013-01-26 14:20:19
【问题描述】:

我想在 URL(Web 服务)中传递用户名和密码以进行用户身份验证,这将返回 true 和 false。我这样做如下:

NSString *userName = [NSString stringWithFormat:@"parameterUser=%@",txtUserName];
NSString *passWord = [NSString stringWithFormat:@"parameterPass=%@",txtPassword];
NSData *getUserData = [userName dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *getUserLength = [NSString stringWithFormat:@"%d",[getUserData length]];
NSData *getPassData = [passWord dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *getPassLength = [NSString stringWithFormat:@"%d",[getPassData length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
[request setURL:[NSURL URLWithString:@"http://URL/service1.asmx"]];
[request setHTTPMethod:@"GET"];

现在,我想知道如何在此 URL 中传递我的用户名和密码来发出请求。 有人可以建议或提供一些示例代码吗? 谢谢。

【问题讨论】:

  • 我猜这是为了锻炼,因为那非常不安全。
  • 您真的不应该将用户名或密码放在 URL 中。相反,它应该在标头或正文中,最好是编码/加密,通过 https(安全 http)发送。
  • @Paaske 感谢您的建议。其实我想让它安全。我该怎么做?

标签: iphone ios url nsurl


【解决方案1】:

试试这个:-

NSString *userName = [NSString stringWithFormat:@"parameterUser=%@",txtUserName.text];
    NSString *passWord = [NSString stringWithFormat:@"parameterPass=%@",txtPassword.text];
    NSData *getUserData = [userName dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    NSString *getUserLength = [NSString stringWithFormat:@"%d",[getUserData length]];
    NSData *getPassData = [passWord dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    NSString *getPassLength = [NSString stringWithFormat:@"%d",[getPassData length]];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
    [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://URL/service1.asmx?%@&%@",userName,passWord]]];
    [request setHTTPMethod:@"GET"];

希望对你有帮助..

【讨论】:

    【解决方案2】:
    NSString *urlStr = [NSString stringWithFormat:@"http://URL/service1.asmx?%@&%@",userName,passWord];
    [request setURL:[NSURL URLWithString:urlStr]];
    

    【讨论】:

    • 感谢您提供此代码。但它是否安全?如果不安全,我该如何建立安全连接?
    • 这取决于您的服务器是否期望 usrName/pswd 在发布数据中。通常凭据是在发布数据中设置的。我不知道你的服务器在期待什么
    • 我的数据库正在等待字符串。你的意思是,它应该是这样才能确保安全吗?[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"URL/service1.asmx?%@&%@",userName,passWord]]]; [request setHTTPMethod:@ "POST"]; 还是需要添加什么?
    【解决方案3】:

    首先,我不会在 url 中传递用户名和密码。您应该使用 post 来执行此操作。

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://URL/service1.asmx?"]];
    
    NSString *userName = [NSString stringWithFormat:@"parameterUser=%@",txtUserName];
    NSString *passWord = [NSString stringWithFormat:@"parameterPass=%@",txtPassword];
    NSString *postString = [NSString stringWithFormat:@"username=%@&password=%@",userName, passWord];
    NSData *postData = [NSData dataWithBytes: [postString UTF8String] length: [postString length]];
    
    //URL Requst Object
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:TIMEOUT];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody: postData];
    

    这比在 url 中传递敏感数据更安全。

    编辑

    要获得回复,您可以查看此内容。 NSURLConnectionAppleDoc NSURLConnection

    您可以使用几种不同的方法来处理来自服务器的响应。 你可以使用NSURLConnectionDelegate

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    [self.connection start];
    

    连同委托回调:

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    
        NSLog(@"didReceiveData");
        if (!self.receivedData){
            self.receivedData = [NSMutableData data];
        }
        [self.receivedData appendData:data];
    }
    
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    
        NSLog(@"connectionDidFinishLoading");
        NSString *receivedString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"receivedString:%@",receivedString);
    
    }
    

    或者你也可以使用NSURLConnection sendAsynchronousRequest

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    [NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
    {
        NSString *receivedString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"receivedString:%@",receivedString);
    
    }];
    

    【讨论】:

    • 感谢您的建议;我如何检查,成功或失败(即真或假),因为我的网络服务根据成功或失败返回“真”或“假”。另外,这个“应用程序/x-www-form-”的值是多少urlencoded”和“Content-Type”,我可以保持原样吗?我是新手,请建议。
    • 看来你的建议比较合适,能否请您多提点意见或回复我的评论?谢谢。
    • 我在我的帖子中添加了一个编辑,其中包含有关如何从服务器获取返回响应的链接。我将使用一些示例代码添加另一个编辑。
    【解决方案4】:

    为了提高安全性,您可以使用 Http Basic Authentication。 有答案here

    【讨论】:

    • 我不想使用基本身份验证,因为我的网络不受信任。谢谢。
    猜你喜欢
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2021-12-14
    • 2016-11-09
    • 2018-12-19
    相关资源
    最近更新 更多