如何使用WebClient.DownloadFile摘要式身份验证和查询字符串?
当我尝试使用它时,我得到401响应.
这是Apache错误日志:
[Tue Jun 24 17:31:49 2014] [error] [client x.x.x.x] Digest: uri mismatch - </file-1.php> does not match request-uri </file-1.php?since=1403587422>
以下是我尝试下载文件的方法:
Uri uri = new Uri("http://example.com/file-1.php?since=1403587422");
WebClient webClient = new WebClient();
CredentialCache credentialCache = new CredentialCache();
credentialCache.Add(
  new Uri(uri.GetLeftPart(UriPartial.Authority)),
  "Digest",
  new NetworkCredential("username", "password")
);
webClient.Credentials = credentialCache;
webClient.DownloadFile(uri, file.OutputFile);
我应该将哪个基本身份验证,摘要身份验证和Oauth用于我的Web应用程序,以允许用户通过Restful API调用访问资源.
取代基本和摘要身份验证不是Oauth更好的解决方案吗?
authentication oauth basic-authentication digest-authentication
所以我决定对我的REST API使用摘要HTTP身份验证.我用Google搜索并在PHP手册中找到了一个条目,其中有一个如何操作的示例.所以我复制脚本,将它放在我的服务器上的index.php中,在浏览器中打开页面,在输入我的凭据后,浏览器再次询问它们,我陷入无限循环的输入凭据.该脚本包含在下面,可以在这里找到.
示例#7摘要HTTP身份验证示例
<?php
$realm = 'Restricted area';
//user => password
$users = array('admin' => 'mypass', 'guest' => 'guest');
if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: Digest realm="'.$realm.
           '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');
    die('Text to send if user hits Cancel button');
}
// analyze the PHP_AUTH_DIGEST variable
if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
    !isset($users[$data['username']]))
    die('Wrong Credentials!');
// generate the valid response
$A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
$valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);
if ($data['response'] != $valid_response)
    die('Wrong …我写了一个小型的网络服务器,目前在ssl上使用基本的auth.到目前为止一切都很好.现在我想(需要)切换到摘要身份验证.但我无法弄清楚如何使用未在数据库中以明文形式存储的密码来完成此工作?我只存储了用户密码的密码摘要(使用bcrypt生成).是否可以使用http digest auth?
任何人都可以使用Google Volley进行Web服务调用(REST)来帮助我实现摘要身份验证.
基本上Volley正在使用SHA1身份验证(Basic Auth),但有没有办法用digest Auth(MD5)进行修改.
我必须用Node.JS编写一些代码来获取API文档,但是我在最近几天尝试了我在网上找到的所有解决方案(包括Stack当然)都没有成功...
我的API使用HTTP Digest Auth,这就是问题,我能够连接,这不是什么大问题,但每次我得到相同的回报:
Got response : 401
HTTP Digest Authentication required for "api.example.com"
你可以在没有auth的情况下显示我的基本代码!因为我做了所有的尝试后我不知道自己能做什么:
var http = require('http')
var options = {
    host: 'api.example.com',
    path: '/example/1.xml',
};
var request = http.get(options, function(res){
    var body = "";
    res.on('data', function(data){
        body += data;
    })
    res.on('end', function(){
        console.log('Got response : ' + res.statusCode);
        console.log(body);
    })
    res.on('error', function(e){
        console.log('Got error : ' +e.message);
    });
});
我最后一次尝试是使用这个模块https://npmjs.org/package/request但是每次我得到401时他都不会工作!
有关更多信息,我能够使用Ruby,Python,php和Java连接并获取我需要的API信息,因此我确信我的API运行良好,并且我传递的信息是正确的.我使用Node v0.10.11的最后一个稳定版!
如果有人可以帮助我或找到解决方案,我会很高兴.
编辑:我将使用模块Mickael/request添加有关我的测试的一些细节
第一次尝试 :
var request = require('request')
var options = …httprequest digest digest-authentication http-digest node.js
最近,我们一直致力于一个项目,该项目将我们的Tomcat Web服务器与移动设备上的一些特定服务集成在一起.在我们与设备交互(通过HTTP)期间我们可以做的事情之一是让设备提示用户提供凭据.用户输入凭据后,我们的服务器会收到一个HTTP帖子,其中包含标准HTTP摘要认证标头(带有nonce,realm,response等的授权标头).没有什么大惊喜.
我们的服务器(按设计)实际上并不包含任何用户的密码.我们保留了密码的SHA512哈希值.对于本地用户,我们可以在登录到应用程序时开始存储"用户名:realm:password"的MD5.当您不存储密码时,这是处理摘要身份验证的常用方法吗?
更重要的是,我们通过我们为验证编写的一些JNDI代码与LDAP服务器进行交互.由于设备被强制通过http与我们的服务器进行身份验证,而digest是唯一支持的授权方法,我们似乎无法找到使用摘要响应通过LDAP对用户进行身份验证的方法.从概念上讲,你能够"代理"摘要请求似乎并不正确.是否有工作流程允许这种类型的"通过"身份验证,如果是这样,它甚至是一个好主意?
谢谢!
是否可以在ASP.NET Core/Kestrel中使用摘要式身份验证?如果是,我该如何启用和使用它?
我知道基本身份验证不会也不会实现,因为它被认为是不安全和缓慢的,但我找不到任何关于摘要的内容.
我不想使用IIS的身份验证,因为我不想绑定到Windows帐户,我想使用自定义凭据验证逻辑.
我的目标是能够html/xml data从受密码保护的页面进行解析,然后根据我需要发送xml commands到另一台设备的数据(时间戳)进行解析。我试图访问的页面是由 IP 设备生成的网络服务器。另外,如果用另一种语言更容易完成,请告诉我。我的编程经验很少(一门C编程课)
我曾尝试使用 Requests for Basic 和 Digest Auth。我仍然无法通过身份验证,这使我无法进一步了解。
这是我的尝试:
import requests
from requests.auth import HTTPDigestAuth
url='http://myUsername:myPassword@example.com/cgi/metadata.cgi?template=html'
r = requests.get(url, auth=HTTPDigestAuth('myUsername', 'myPassword'))        
r.status_code
print(r.headers) 
print(r.status_code)
输出:
401 
CaseInsensitiveDict({'Content-Length': '0', 'WWW-Authenticate': 'Digest realm="the realm of device", nonce="23cde09025c589f05f153b81306928c8", qop="auth"', 'Server': 'Device server name'})
我也尝试BasicAuth过请求并获得相同的输出。我已经尝试过包括user:pass@url 内的 和 不包括在内。尽管当我将该输入放入浏览器时,它可以工作。
我认为请求处理了标头数据,Digest/BasicAuth但也许我还需要包含标头?
我使用了 Live HTTP Headers(firefox) 并得到了这个:
GET /cgi/metadata.cgi?template=html
HTTP/1.1 
Host: [Device IP] 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0 Accept: …我正在尝试扩展SocketRocket库的功能.我想添加身份验证功能.
由于此库使用CFNetwork CFHTTPMessage*API进行HTTP功能(需要启动Web套接字连接),我正在尝试使用此API来提供身份验证.
有完美匹配的功能:CFHTTPMessageAddAuthentication,但它不能像我期望的那样工作(据我理解的文档).
以下是显示问题的代码示例:
- (CFHTTPMessageRef)createAuthenticationHandShakeRequest: (CFHTTPMessageRef)chalengeMessage {
    CFHTTPMessageRef request = [self createHandshakeRequest];
    BOOL result = CFHTTPMessageAddAuthentication(request,
                                                 chalengeMessage,
                                                 (__bridge CFStringRef)self.credentials.user,
                                                 (__bridge CFStringRef)self.credentials.password,
                                                 kCFHTTPAuthenticationSchemeDigest, /* I've also tried NULL for use strongest supplied authentication */
                                                 NO);
    if (!result) {
        NSString *chalengeDescription = [[NSString alloc] initWithData: CFBridgingRelease(CFHTTPMessageCopySerializedMessage(chalengeMessage))
                                                              encoding: NSUTF8StringEncoding];
        NSString  *requestDescription = [[NSString alloc] initWithData: CFBridgingRelease(CFHTTPMessageCopySerializedMessage(request))
                                                              encoding: NSUTF8StringEncoding];
        SRFastLog(@"Failed to add authentication data `%@` to a request:\n%@After a chalenge:\n%@",
                  self.credentials, requestDescription, chalengeDescription); …http ×3
digest ×2
.net ×1
android ×1
apache ×1
asp.net-core ×1
bcrypt ×1
c# ×1
cfnetwork ×1
http-digest ×1
httprequest ×1
ios ×1
java ×1
ldap ×1
macos ×1
node.js ×1
oauth ×1
objective-c ×1
php ×1
python-3.x ×1
webclient ×1
xml ×1