【问题标题】:indy https GET - authenticationindy https GET - 身份验证
【发布时间】:2015-11-11 13:34:52
【问题描述】:

我正在尝试使 HTTPS-get 请求正常工作,以加载网址以“https:”开头的网页。我正在使用带有 delphi 7 的 Indy10 (5248)。我似乎无法获得正确的授权,即使使用我在浏览器中使用的相同名称/密码或域名/名称/密码。我得到的只是相同的服务器响应,就好像在浏览器中我会取消身份验证请求一样。

现在有几种方法可以提供姓名/密码:

  • 它们可以作为属性值输入到 idHTTP.request 中
  • 同上,在 idHTTP.ProxyParams 中
  • idHTTP 有许多 on...Authorization-events
  • a Post-example 使用命名参数,但这似乎特定于它试图访问的 google 站点(否则,我将如何找出参数名称......?)

此外还有选项。尽管组合的数量有限,但我还没有找到适合我的组合。这样做的正确方法是什么?

s := IdHTTP1.Get('https://qwerty.wur.nl');
Memo1.Lines.Add(Format('Response Code: %d', [IdHTTP1.ResponseCode]));
Memo1.Lines.Add(Format('Response Text: %s', [IdHTTP1.ResponseText]));

Memo1.Lines.Add(s);

【问题讨论】:

    标签: delphi authentication https delphi-7 indy


    【解决方案1】:

    您不需要代理参数。改为设置IdHTTP1.Request.BasicAuthentication

    IdHTTP1.Request.BasicAuthentication:= true;
    IdHTTP1.Request.UserName := UserName;
    IdHTTP1.Request.Password := Password;
    

    请注意,您需要为 SSL 准备应用程序和 IdHTTP1,如下所述:Delphi: idHttp+SSL 和此处 TIdHTTP.Get EIdIOHandlerPropInvalid Error

    【讨论】:

    • 因此,您的建议是通过请求进行身份验证。它也必须有其他东西,因为这是我尝试过的变体之一(现在重新检查,使用“新鲜”的 idHTTP 组件)。我认为丢失的 dll 以一种不那么模棱两可的方式让自己知道(无法加载 SSL 库。)。
    • 当您拥有 HTTP 身份验证时,您需要通过 IdHTTP1.Request 进行身份验证。你有什么样的认证?您收到的回应是什么? ResponseCode、ResponsMessage?
    • 1. BasicAuthentication=true 并不总是正确的使用方法。它只是告诉TIdHTTP,如果没有指定其他身份验证,它可以使用BASIC 身份验证。并非所有服务器都支持BASIC,因为它不安全。 2. 见New HTTPS functionality for TIdHTTP
    • 响应为“401 - 未经授权:由于凭据无效,访问被拒绝”。我不明白这个问题:你有什么样的身份验证?我已经按照这里的建议为请求提供了名称和密码,BasicAuthentication 交替真假。
    • 如果没有对象分配给TIdHTTP.Request.Authentication 属性,并且TIdHTTP.Request.BasicAuthentication 为真,TIdHTTP 将默认TIdBasicAuthentication 对象分配给Authentication 属性。如果TIdHTTP.OnSelectAuthorization 被触发,Authentication 属性将被分配一个选定AuthenticationClass 的新对象。因此,Authentication 对象决定使用哪个身份验证方案在 HTTP Authentication 标头中向服务器发送凭据。听起来服务器不接受BASIC身份验证。
    【解决方案2】:

    TIdHTTP 中指定HTTP 身份验证凭据的正确方法是使用TIdHTTP.Request 属性。这就是TIdHTTP 在启动新的经过身份验证的会话时寻找它们的地方。如果服务器拒绝/挑战身份验证,则会触发 OnSelectAuthorizationOnAuthorization 事件以允许应用分别选择不同的身份验证方案和/或提供不同的凭据。

    至于POST example,它发布了一个HTML 网络表单,就像您在网站的登录页面上看到的那样。参数是通过分析定义网络表单的 HTML 来确定的,就像网络浏览器一样。 Webform 身份验证与 HTTP 身份验证无关。两者并不互斥,如果服务器决定可以一起使用。

    【讨论】:

    • 感谢您确认我对后示例的怀疑。但是:服务器拒绝接收到的身份验证,但当 BasicAuthentication 为 True 时 OnSelectAuthorization 和 OnAuthorization 都不会触发;虽然当 BasicAuthentication 为 False 时 OnSelectAuthentication 会触发 - 我应该对该事件做出反应吗? (AuthenticationClass 是 TIdSSPINTLMAuthentication)。
    • On(Select)Authorization 在服务器返回 401 响应时触发,该响应向客户端提供可用的身份验证方案和质询数据,以便它可以使用新的/更新的 Authentication 标头重试请求。如果服务器返回 403 响应,则认证失败。因此,当BasicAuthentication 为真时,听起来服务器正在返回 403。在OnSelectAuthorization 中,AuthenticationClass 使用 Indy 基于可用的身份验证类的选择进行初始化,但您可以用另一个身份验证类覆盖它,只要它的方案在 AuthInfo 参数中列出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多