`
wangleyiang
  • 浏览: 220820 次
社区版块
存档分类
最新评论

访问需要HTTP Basic Authentication认证的资源的各种语言的实现

阅读更多

无聊想调用下嘀咕的api的时候,发现需要HTTP Basic Authentication,就看了下。

什么是HTTP Basic Authentication?直接看http://en.wikipedia.org/wiki/Basic_authentication_scheme 吧。

在你访问一个需要HTTP Basic Authentication的URL的时候,如果你没有提供用户名和密码,服务器就会返回401,如果你直接在浏览器中打开,浏览器会提示你输入用户名 和密码(google浏览器不会,bug?)。你可以尝试点击这个url看看效果:http://api.minicloud.com.cn/statuses/friends_timeline.xml

要在发送请求的时候添加HTTP Basic Authentication认证信息到请求中,有两种方法:

下面来看下对于第一种在请求中添加Authorization头部的各种语言的实现代码。

先看.NET的吧:

string username="username";
string password="password";
//注意这里的格式哦,为 "username:password"
string usernamePassword = username + ":" + password;
CredentialCache mycache = new CredentialCache();
mycache.Add(new Uri(url), "Basic", new NetworkCredential(username, password));
myReq.Credentials = mycache;
myReq.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword))); 

WebResponse wr = myReq.GetResponse();
Stream receiveStream = wr.GetResponseStream();
StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8);
string content = reader.ReadToEnd();

你当然也可以使用HttpWebRequest或者其他的类来发送请求。

然后是Python的:

import urllib2
import sys
import re
import base64
from urlparse import urlparse 

theurl = 'http://api.minicloud.com.cn/statuses/friends_timeline.xml' 

username = 'qleelulu'
password = 'XXXXXX'  # 你信这是密码吗? 

base64string = base64.encodestring(
                '%s:%s' % (username, password))[:-1] #注意哦,这里最后会自动添加一个\n
authheader =  "Basic %s" % base64string
req.add_header("Authorization", authheader)
try:
    handle = urllib2.urlopen(req)
except IOError, e:
    # here we shouldn't fail if the username/password is right
    print "It looks like the username or password is wrong."
    sys.exit(1)
thepage = handle.read()

 再来是PHP的:

<?php
$fp = fsockopen("www.mydomain.com",80);
fputs($fp,"GET /downloads HTTP/1.0");
fputs($fp,"Host: www.mydomain.com");
fputs($fp,"Authorization: Basic " . base64_encode("user:pass") . "");
fpassthru($fp);
?>

 还有flash的AS3的:

import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.utils.Base64Encoder;
import mx.rpc.http.HTTPService;
URLRequestDefaults.authenticate = false;//设默认为false,否则用户较验错误时会弹出验证框 

private var result:XML;
private function initApp():void
{
    var base64enc:Base64Encoder = new Base64Encoder;
    base64enc.encode("user:password"); //用户名和密码需要Base64编码
    var user:String = base64enc.toString(); 

    var http:HTTPService = new HTTPService;
    http.addEventListener(ResultEvent.RESULT,resultHandler);//监听返回事件
    http.addEventListener(FaultEvent.FAULT,faultHandler);     //监听失败事件
    http.resultFormat = "e4x";//返回格式
    http.url = "http://api.digu.com/statuses/friends_timeline.xml"; 以嘀咕网的API为列
    http.headers = {"Authorization":"Basic " + user};
    http.send();
}
private function resultHandler(e:ResultEvent):void
{
    result = XML(e.result);
    test.dataProvider = result.status;//绑定数据
}
private function faultHandler(e:ResultEvent):void
{
    //处理失败
}

 还有Ruby On Rails的:

class DocumentsController < ActionController
  before_filter :verify_access 

  def show
    @document = @user.documents.find(params[:id])
  end 

  # Use basic authentication in my realm to get a user object.
  # Since this is a security filter - return false if the user is not
  # authenticated.
  def verify_access
    authenticate_or_request_with_http_basic("Documents Realm") do |username, password|
      @user = User.authenticate(username, password)
    end
  end
end

 JavaScript的:

//需要Base64见:http://www.webtoolkit.info/javascript-base64.html
function make_base_auth(user, password) {
  var tok = user + ':' + pass;
  var hash = Base64.encode(tok);
  return "Basic " + hash;
} 

var auth = make_basic_auth('QLeelulu','mypassword');
var url = 'http://example.com'; 

// 原始JavaScript
xml = new XMLHttpRequest();
xml.setRequestHeader('Authorization', auth);
xml.open('GET',url) 

// ExtJS
Ext.Ajax.request({
    url : url,
    method : 'GET',
    headers : { Authorization : auth }
}); 

// jQuery
$.ajax({
    url : url,
    method : 'GET',
    beforeSend : function(req) {
        req.setRequestHeader('Authorization', auth);
    }
});

 这里提醒下,HTTP Basic Authentication对于跨域又要发送post请求的用JavaScript是实现不了的(注:对于Chrome插件这类允许通过AJAX访问跨域资源的,是可以的)。

 

来源:http://www.cnblogs.com/QLeelulu/archive/2009/11/22/1607898.html

 

分享到:
评论

相关推荐

    BasicAuth的Java服务端实现

    **标题解析:** "BasicAuth的Java服务端实现" 指的是使用Java语言在服务端实现HTTP的基本认证(Basic Authentication)机制。这种认证方式是HTTP协议标准的一部分,用于在网络服务器上验证用户身份。 **基本认证...

    ring-basic-authentication:强制执行基本身份验证的环形中间件

    Ring-Basic-Authentication是针对Clojure Web开发框架Ring的一个中间件,它允许开发者在Web应用程序中实现基本的HTTP身份验证机制。这个中间件是基于HTTP协议的“Basic Authentication”规范,该规范要求用户在访问...

    关于Rails登录和验证插件http_authentication restful-authentication

    这个模块提供了基础的HTTP身份验证处理方法,例如`http_basic_authenticate_with`,可以在控制器级别设置,确保只有经过验证的用户才能访问特定的资源或操作。 接下来,我们转向RESTful Authentication。这是一个...

    带basic认证的http get协议,C#

    本文将深入探讨如何在C#编程语言中实现带有基本认证(Basic Authentication)的HTTP GET请求,同时处理返回的JSON数据。 HTTP GET请求是HTTP协议中最简单也最常用的方法之一,它用于从服务器获取资源。然而,在访问...

    basic-logic.rar

    本教程资源"basic-logic.rar"旨在帮助那些希望快速掌握系统登录与认证实现的开发者,特别是对于Java和SpringBoot框架的应用开发者来说,这是一个宝贵的起点。 Java作为一种广泛使用的编程语言,其丰富的库和强大的...

    php接口认证

    API接口认证是确保只有授权的用户或服务能够访问特定资源的关键步骤,它通常涉及到身份验证和授权两部分。 身份验证(Authentication)是确定用户或系统身份的过程,而授权(Authorization)则是决定验证过的用户或...

    企业级的 Go 语言实战项目:认证和授权系统(带配套课程).zip

    【标题】中的“企业级的 Go 语言实战项目:认证和授权系统”表明这是一个使用 Go 语言开发的实际项目,重点在于构建一个适用于企业的认证(Authentication)和授权(Authorization)系统。在IT领域,认证和授权是...

    Python库 | openlxp_authentication-1.1.1-py3-none-any.whl

    授权则是确定已认证的用户可以访问哪些资源或执行哪些操作。这个库可能提供了角色基础的权限控制,通过分配不同的角色给用户,从而限制或允许他们访问特定的功能或数据。此外,也可能支持基于策略的授权,允许开发者...

    acegi的详细配置实现

    配置匿名认证通常需要指定哪些资源可以被匿名访问。 #### 十五、记住我认证 ##### 15.1 概览 记住我认证是一种方便的功能,它可以让用户在关闭浏览器后仍然保持登录状态。 ##### 15.2 配置 配置记住我认证涉及...

    Python语言开发RESTful API指南

    常用的认证机制有基本认证(Basic Auth)、摘要认证(Digest Auth)和OAuth。基本认证是通过用户名和密码进行认证,摘要认证则提供了一定程度的安全性增强,而OAuth则允许第三方应用在没有暴露用户名和密码的情况下...

    BasicAuth:内置在Node中的基本用户身份验证API

    描述中提到的是Node.js内部支持的Basic Auth功能,这是一个用于保护Web应用程序或API的基础安全层,允许开发者轻松地实现对资源访问的控制。通过这个API,开发者可以设定特定的用户名和密码组合,只有提供正确凭证的...

    Acegi

    - **Anonymous Authentication**:匿名访问,适用于不需用户认证的公开资源。 - **Remember-Me Authentication**:自动登录功能,提供便捷的用户体验。 - **X509 Authentication**:基于X509证书的认证,适用于...

    已完成认证和授权,为后续开发做准备

    2. **选择合适的认证和授权框架**:如上所述,Spring Security是一个流行的选择,它提供了一套完整的解决方案,包括基于角色的访问控制(RBAC)、表达式语言(EL)进行动态授权等。 3. **配置安全设置**:配置认证...

    http_test.zip_SOCKET用户_c++socket4代理_代理_代理 socket_代理验证

    代理验证(Proxy Authentication)是当代理服务器要求用户提供凭证才能访问网络资源时的过程。HTTP协议定义了几种认证机制,如Basic Auth和Digest Auth。在C++中,实现代理认证通常涉及到将用户名和密码编码成Base64...

    Spring Security

    DAO Authentication Provider是一种强大的认证提供者,它允许开发者自定义数据访问层,从而实现高度定制化的认证逻辑。 ##### 8.1 Java Authentication and Authorization Service (JAAS) 提供者概述 JAAS是Java...

    springsecurity.pdf

    JAAS(Java Authentication and Authorization Service)认证提供者是一种利用Java标准库实现的认证机制。 ##### 8.2 配置 配置JAAS认证提供者涉及到创建回调处理器和权限授予器等步骤,以便实现与JAAS框架的集成...

    cccctyl-java-basic-notes-master_java_

    【标题】"cccctyl-java-basic-notes-master_java_" 指的可能是一个关于Java基础学习的项目,其中包含了作者cccctyl对Java编程语言核心概念的深入理解和实践笔记。这个项目特别关注了权限设置和安全模块,这在任何...

    springboot整合security例子

    3. **配置用户详情服务**:为了处理用户的认证,你需要实现`UserDetailsService`接口,提供获取用户信息的方法。通常,这会从数据库或其他数据源加载用户信息。 4. **自定义登录逻辑**:你可以通过重写`...

Global site tag (gtag.js) - Google Analytics