`
blueyanghualong
  • 浏览: 222417 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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:
Authorization: "Basic 用户名和密码的base64加密字符串"
二是在url中添加用户名和密码:
http://userName:password@api.minicloud.com.cn/statuses/friends_timeline.xml

//需要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);
    }
});
下面摘录一段 Jsp实现鉴权的代码逻辑
 以下是一段Jsp鉴权操作 
1、server发送一个要求认证代码401和一个头信息WWW-authenticate,激发browser弹出一个认证窗口
 2、server取得browser送来的认证头"Authorization",它是加密的了,要用Base64方法解密,取得明文的用户名和密码
  
3、检查用户名和密码,根据结果传送不同的页面
 
=========Jsp代码===================
<jsp:useBean id="base64" scope="page" class="Base64"/>  
<%   
if(request.getHeader("Authorization")==null){   
response.setStatus(401);   
response.setHeader("WWW-authenticate", "Basic realm="unixboy.com"");   
}else{   
String encoded=(request.getHeader("Authorization"));   
String tmp=encoded.substring(6);   
String up=Base64.decode(tmp);   
String user="";   
String password="";   
if(up!=null){   
user=up.substring(0,up.indexOf(":"));   
password=up.substring(up.indexOf(":")+1);   
}   
if(user.equals("unixboy")&&password.equals("123456")){   
//认证成功   
}else{   
//认证失败   
}   
}   
%> 

=======Java段代码==================

//消息加解密class   
public class Base64   
{   
/** decode a Base 64 encoded String.   
* <p><h4>String to byte conversion</h4>  
* This method uses a naive String to byte interpretation, it simply gets each   
* char of the String and calls it a byte.</p>  
* <p>Since we should be dealing with Base64 encoded Strings that is a reasonable   
* assumption.</p>  
* <p><h4>End of data</h4>  
* We don′t try to stop the converion when we find the "=" end of data padding char.   
* We simply add zero bytes to the unencode buffer.</p>  
*/   
public static String decode(String encoded)   
{   
StringBuffer sb=new StringBuffer();   
int maxturns;   
//work out how long to loop for.   
if(encoded.length()%3==0)   
maxturns=encoded.length();   
else   
maxturns=encoded.length()+(3-(encoded.length()%3));   
//tells us whether to include the char in the unencode   
boolean skip;   
//the unencode buffer   
byte[] unenc=new byte[4];   
byte b;   
for(int i=0,j=0; i<maxturns; i++)   
{   
skip=false;   
//get the byte to convert or 0   
if(i<encoded.length())   
b=(byte)encoded.charAt(i);   
else   
b=0;   
//test and convert first capital letters, lowercase, digits then ′+′ and ′/′   
if(b>=65 && b<91)   
unenc[j]=(byte)(b-65);   
else if(b>=97 && b<123)   
unenc[j]=(byte)(b-71);   
else if(b>=48 && b<58)   
unenc[j]=(byte)(b+4);   
else if(b==′+′)   
unenc[j]=62;   
else if(b==′/′)   
unenc[j]=63;   
//if we find "=" then data has finished, we′re not really dealing with this now   
else if(b==′=′)   
unenc[j]=0;   
else   
{   
char c=(char)b;   
if(c==′ ′ || c==′ ′ || c==′ ′ || c==′ ′)   
skip=true;   
else   
//could throw an exception here? it′s input we don′t understand.   
;   
}   
//once the array has boiled convert the bytes back into chars   
if(!skip && ++j==4)   
{   
//shift the 6 bit bytes into a single 4 octet word   
int res=(unenc[0] << 18)+(unenc[1] << 12)+(unenc[2] << 6)+unenc[3];   
byte c;   
int k=16;   
//shift each octet down to read it as char and add to StringBuffer   
while(k>=0)   
{   
c=(byte)(res >> k);   
if ( c > 0 )   
sb.append((char)c);   
k-=8;   
}   
//reset j and the unencode buffer   
j=0;   
unenc[0]=0;unenc[1]=0;unenc[2]=0;unenc[3]=0;   
}   
}   
return sb.toString();   
}   
  
/** encode plaintext data to a base 64 string   
* @param plain the text to convert. If plain is longer than 76 characters this method   
* returns null (see RFC2045).   
* @return the encoded text (or null if string was longer than 76 chars).   
*/   
public static String encode(String plain)   
{   
if(plain.length()>76)   
return null;   
int maxturns;   
StringBuffer sb=new StringBuffer();   
//the encode buffer   
byte[] enc=new byte[3];   
boolean end=false;   
for(int i=0,j=0; !end; i++)   
{   
char _ch=plain.charAt(i);   
if(i==plain.length()-1)   
end=true;   
enc[j++]=(byte)plain.charAt(i);   
if(j==3 || end)   
{   
int res;   
//this is a bit inefficient at the end point   
//worth it for the small decrease in code size?   
res=(enc[0] << 16)+(enc[1] << 8)+enc[2];   
int b;   
int lowestbit=18-(j*6);   
for(int toshift=18; toshift>=lowestbit; toshift-=6)   
{   
b=res >>> toshift;   
b&=63;   
if(b>=0 && b<26)   
sb.append((char)(b+65));   
if(b>=26 && b<52)   
sb.append((char)(b+71));   
if(b>=52 && b<62)   
sb.append((char)(b-4));   
if(b==62)   
sb.append(′+′);   
if(b==63)   
sb.append(′/′);   
if(sb.length()%76==0)   
sb.append(′ ′);   
}   
//now set the end chars to be pad character if there    
//was less than integral input (ie: less than 24 bits)   
if(end)   
{   
if(j==1)   
sb.append("==");   
if(j==2)   
sb.append(′=′);   
}   
enc[0]=0; enc[1]=0; enc[2]=0;   
j=0;   
}   
}   
return sb.toString();   
}   
}   
分享到:
评论
1 楼 yiqing 2016-05-22  
   不错 有帮助  

相关推荐

    http basic authentication通过post方式访问api示例分享 basic认证示例

    在HTTP中,基本认证是一种用来允许Web浏览器或其他客户端程序在请求时提供以用户名和口令形式的凭证,这篇文章主要介绍了http basic authentication通过post方式访问api示例,大家参考使用吧

    java实现HTTP 基本认证 (Basic Authentication)

    java实现HTTP 基本认证 (Basic Authentication) 大家在登录网站的时候,大部分时候是通过一个表单提交登录信息。 但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用 HTTP 基本认证。 下面来看看一...

    通过PB代码实现访问Digest authentication认证

    针对PB 开发者,并需要访问Digest Authentication认证。 该案例是通过PB 2019 R3 Build 2170版本来开发的。需要使用到PB 2017 版本后的新功能httpclient对象及加密对象。

    webService添加basic验证

    webService添加basic验证,为了WebService的安全,将webservice添加basic验证,用户在调用时需要提供授权信息进行调用

    调用API

    然后进入新浪微博开放平台查看相关文档,在文档中(使用Basic Auth进行用户验证)发现新浪微博开发团队推荐了园子里的Q.Lee.lulu写的一篇博文:访问需要HTTP Basic Authentication认证的资源的各种语言的实现。...

    路由器Basic Auth暴力破解器 v1.0 (VC源码)

    采用VC编程,源碼VS2010编译...针对使用Basic Authentication认证的管理后台登录方式做暴力破解 程序有小BUG,但是猜解没有问题 相关开发进度请参阅CSDN BLOG http://blog.csdn.net/yehjordan/article/details/18892355

    l5-very-basic-auth:Laravel的无状态HTTP基本身份验证,无需数据库

    Laravel非常基本的身份验证 文档可在以下位置找到: :United_Kingdom: :Japan:该软件包允许您在路由上添加HTTP Basic Auth过滤器,而无需使用数据库-Laravel默认auth.basic -middleware所依赖。 当您想让客户在尚未...

    Spring Boot核心技术-笔记_springboot_

    springboot 核心技术讲解笔记,从入门到精通,对springboot的各方面知识点讲解,非常的细致

    express-authentication-basic:用于Express的HTTP Basic中间件与Express身份验证兼容

    基本认证 HTTP基本支持与兼容。 它太酷了。 使用: var express = require ( 'express' ) , auth = require ( 'express-authentication' ) , basic = require ( 'express-authentication-basic' ) ; var app =...

    基本认证「Basic Authentication」-crx插件

    基本身份验证插件 - 保持简单 请注意,此扩展程序不会收集,存储或处理您的私人信息,也不会收集任何分析数据。基本身份验证凭据存储在本地计算机上,并且不与任何外部服务同步。扩展程序卸载后,所有保存的数据都将...

    authentication_basic

    自述文件基本认证应用什么剂量呢? 它是平面用户认证应用程序。类图待定如何使用它提供了网络视图和API。 您可以创建测试帐户。 $ rails db:seed 这是测试帐户信息。 昵称:“ test”, 电子邮件:“ ”, 密码:“ ...

    axis2客户端调用带Ntlm认证例子

    axis2客户端,调用带ntlm认证的web service的代码例子和所需jar和java

    前后端常见的几种鉴权方式(小结)

    HTTP Basic Authentication session-cookie Token 验证 OAuth(开放授权) 一.HTTP Basic Authentication  这种授权方式是浏览器遵守http协议实现的基本授权方式,HTTP协议进行通信的过程中,HTTP协议定义了基本...

    详解nginx basic auth配置踩坑记

    本篇文章主要介绍了详解nginx basic auth配置踩坑记,nginx的basic auth配置由ngx_http_auth_basic_module模块提供,对HTTP Basic Authentication协议进行了支持,感兴趣的小伙伴们可以参考一下

    http身份验证:PSR-15中间件,用于实现基本和摘要Http身份验证

    Dispatcher :: run ([ new Middlewares \ BasicAuthentication ([ 'username1' =&gt; 'password1' , 'username2' =&gt; 'password2' ])]); (可选)您可以提供Psr\Http\Message\ResponseFactoryInterface作为第二个参数,...

    flask-angular-http-auth:用flask 和 angular 实现HTTP Basic Auth

    要实现登录认证功能,常用的有以下这两种方法:这两种方法各有优劣,Basic access authentication 主要是胜在简单,只需要在Requset Header中加入 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==,其中字符串...

    grafana-authentication-proxy:Grafana 身份验证代理

    Elasticsearch、grafana 和用户客户端之间的代理支持基本认证保护的 Elasticsearch,只有 grafana-authentication-proxy 知道用户/密码兼容最新的grafana 增强的身份验证方法。 现在支持客户端的 Google OAuth2、...

    spring security3.2.0

    HTTP BASIC authentication headers (一个基于IEFT RFC 的标准) HTTP Digest authentication headers (一个基于IEFT RFC 的标准) HTTP X.509 client certificate exchange (一个基于IEFT RFC 的标准) LDAP (一个非常...

    SpringSecurity项目

    springsecurity是一个功能强大且高度可定制的身份验证和访问控制框架。springsecurity是一个...最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式。

    ASP.NET Core 实现基本认证的示例代码

    在HTTP中,HTTP基本认证(Basic Authentication)是一种允许网页浏览器或其他客户端程序以(用户名:口令) 请求资源的身份验证方式,不要求cookie,session identifier、login page等标记或载体。 – 所有浏览器据支持...

Global site tag (gtag.js) - Google Analytics