iOS:如何建立安全的 HTTPS 连接以传递凭据?

Posted

技术标签:

【中文标题】iOS:如何建立安全的 HTTPS 连接以传递凭据?【英文标题】:iOS: How to make a secure HTTPS connection to pass credentials? 【发布时间】:2010-08-18 04:57:58 【问题描述】:

我正在创建我的第一个 iPad 应用程序。我有一个 Web 应用程序,我想以 RESTful 方式对其进行身份验证并从中提取数据。

如果您在浏览器中打开 URL (https://myapp.com/auth/login),您将获得一个表单来输入您的用户名和密码。我在想我可以在请求的发布数据中设置登录凭据并提交数据。

该站点使用 HTTPS 进行登录,因此凭据不会以纯文本形式通过 Internet 传递。

如何建立安全的 HTTPS 连接以传递凭据?这会记住我为将来的请求而登录吗?最好的方法是什么?

【问题讨论】:

【参考方案1】:

进一步更新,2013 年 10 月

虽然在我写这个答案的时候,ASIHTTPRequest 得到了广泛的支持,但现在已经不是这样了。不建议在新项目中使用 - 直接使用 NSURLConnection,或者使用 AFNetworking。

使用 AFNetworking,有一个用于 http 身份验证的 [httpClient setAuthorizationHeaderWithUsername:username password:password]; 方法,创建 POST 样式的表单同样容易 - 请参阅 AFNetworking Post Request。


原答案:

很多人在 iPhone/iPad 上使用 ASIHTTPRequest 类来处理 http 和 https,因为它有很多有用的功能,而使用内置类很难或耗时:

http://allseeing-i.com/ASIHTTPRequest/

从最简单的级别开始,您可以从以下内容开始:

  NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

  [request startSynchronous];
  NSError *error = [request error];
  if (!error) 
      NSString *response = [request responseString];
      NSLog(@"response = %@", response);
  

如果您使用 HTTP 身份验证,ASIHTTPRequest 将自动提示用户输入用户名和密码。

如果您使用其他形式的身份验证,您可能需要自己向用户请求用户名和密码,并将它们作为 POST 值或自定义 http 标头提交,然后响应可能包含一个令牌JSON 或 XML 响应,或者它可以设置一个 cookie。

如果您添加有关身份验证方案如何工作的更多详细信息,我可以更具体一些。

更新

根据更新,要模拟 POST 表单,您只需添加如下行:

[request addPostValue:usernameString forKey:@"username"];
[request addPostValue:passwordString forKey:@"password"];

您还需要更改创建请求的方式,而不是:

  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

做:

  ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

(我也忘了在上面提到它,我之前放的代码使用的是同步请求,所以你想用异步请求替换它,以避免一旦你证明它正在工作就阻塞 UI。)

这里有一个适用于 iphone 的 JSON 框架:

http://code.google.com/p/json-framework/

这对我来说效果很好,并且很容易与 ASIHTTPRequest 一起使用。

【讨论】:

我加了一点解释。该应用程序不是基本的 HTTP 身份验证。这是您输入凭据的网页上显示的表单。我正在尝试对其进行调整,以便它可以充当 RESTful API,我可以对其进行身份验证和查询数据(将以 JSON 格式返回)。 好的,我已经更详细地更新了我的答案。从本质上讲,使用 ASIHTTPRequest 应该非常简单。 所以,一旦我将请求“发布”到 /auth/login,我的 iPhone 应用程序会记得它已经过身份验证吗?在浏览器中,设置了 cookie。换句话说,既然我已经“认证”了,我可以提出另一个要求您进行认证的请求吗? (即 GET /users/all) 实际上...我想您可能已经在第一篇文章中回答了这个问题。似乎支持 cookie。我将不得不尝试一下,看看它是如何工作的。 我在 XCode 中收到警告说“ASIHTTPRequest 可能无法响应 -addPostValue:forKey”。我做错了什么?

以上是关于iOS:如何建立安全的 HTTPS 连接以传递凭据?的主要内容,如果未能解决你的问题,请参考以下文章

iOS HTTPS的基本用法 以及连接建立过程

如何使用预先保存的 *** 凭据启动 ***?

MS Access 和 SQL Server 连接(可信来源与传递登录凭据)

MySQL / 存储 MySQL 凭据

如何将自定义凭据传递给 Spring Boot ldap

我如何知道是不是建立了 *** 连接?