HTTP协议授权认证简介

我们平时在打开网页时或者在用浏览器访问你局域网的路由器时,经常会出现弹出登陆页面框要进行登陆授权后才能继续访问。比如如下提示:

HTTP授权验证

上面图片展示的一个场景是客户端在使用HTTP协议和服务端通信时,服务器需要对客户端进行授权认证,客户端输入正确的用户密码后才能继续进行访问。那这个流程是如何实现的呢?

1.客户端请求需要授权认证的URL地址。

GET / HTTP/1.1
Accept: */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.2; .NET CLR 2.0.50727)
Host: 192.168.1.1

2.服务端返回401,告诉客户端这个请求需要授权认证,并且指定授权认证的方式。(在IE中系统会弹出对话框让输入用户和密码)

HTTP/1.1 401 Unauthorized
Server: Router
Connection: close
WWW-Authenticate: Basic realm="TP-LINK Wireless N Router WR740N"
[response body]

3.客户端按服务器要求的授权方式,拼装用户和密码,放入到请求头中,并再次发送。

GET / HTTP/1.1
Accept: */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.2; .NET CLR 2.0.50727)
Host: 192.168.1.1
Authorization: Basic YWRtaW46YWRtaW4=

4.服务端根据提供用户的密码,来决定返回成功还是失败。

HTTP/1.1 200 OK
Server: Router
Connection: close
[successful response body]

我们称上面这种授权认证机制叫challange/response机制,客户端发起请求,服务器发起挑战(challange),客户端接收挑战,服务器返回挑战结果。

在HTTP协议1.0系统中只支持:基本认证(Basic realm),而在1.1中支持摘要认证:(Digest realm),和WSSE(WS-Security)认证 至于使用什么认证由服务端在返回的401响应中的WWW-Authenticate中指定。

1.基本认证(Basic realm)方式下,客户端接受挑战的方式是用: BASE64(用户:密码)的结果返回给服务端。这种方法比较简单,而且在网络传输中很容易被破解。上面的例子用的就是基本认证方式,这时候客户端只需要在请求头中带上: Authorization: [认证的方式] [BASE64(用户:密码)]

2.摘要认证(Digest realm)方式下,服务端在响应401时会返回一个随机数。 客户端 把MD5(用户,密码,随机数)后的值,连同用户一起通过Authorization: 请求头发送给服务端。服务端则根据用户取出对应的密码,随机数同样用MD5(用户,密码,随机数), 如果两者相等则认为认证通过,否则认证失败。查看具体交互过程

3.WSSE(WS-Security)认证。主要用于webservice服务的授权认证,具体请参考WSSE

4.对于我们有时候访问第三方需要授权的资源时,我们采用OAuth协议来让第三方进行授权认证,因此在我们没有登录前,访问这些资源时服务端也可以返回401。同时它还带了如下的响应: WWW-Authenticate: OAuth realm=<your_realm> 这样客户端就知道这种资源是需要OAuth认证的,这时候客户端应该启用Aauth认证机制,也就是OAuth协议可以用http认证的扩展来传输各种数据,也可以自己定义post方式来进行传输,具体参考OAUTH协议。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JavaEdge

Spring Security实战 - 短信登录0 项目文件结构1 SmsCodeAuthenticationFilter2 SmsCodeAuthenticationTokenSmsCodeAuth

在Spring Security实战-认证和Spring Security实战(二)-授权(权限过滤器)两章中。我们已经详细解读过Spring Security...

19710
来自专栏技术博客

Window Server 2008 R2 TFS2010 安装前的准备

http://www.cnblogs.com/aehyok/p/3979707.html 这里简单介绍了安装windows Server 2008 R2系统,...

22850
来自专栏运维小白

HTTP状态码详解

HTTP状态码介绍 状态码的职责是当客户端向服务器发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。 状态码的类...

25750
来自专栏云计算教程系列

如何在Ubuntu 16.04上安装和配置Postfix作为仅发送SMTP服务器

Postfix是一种邮件传输代理(MTA),一种用于发送和接收电子邮件的应用程序。在本教程中,我们将安装和配置Postfix,使它仅可以用于本地应用程序发送电子...

95400
来自专栏云计算教程系列

如何在Ubuntu 14.04上使用Apache将www重定向到非www

当你有你的网站或应用程序启动和运行一个域的背后,则是经常需要还允许用户通过简单的域名访问到它,并在WWW子域名。也就是说,他们应该可以使用或不使用“ www. ...

15600
来自专栏后端技术探索

Restful风格的HTTP Basic Athorization基本认证API接口

话说什么是基本认证? 在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个...

12820
来自专栏王磊的博客

你必须知道的session与cookie

13730
来自专栏月牙寂

k8s源码分析----apiserver之APIGroupVersion

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

51540
来自专栏瓜大三哥

Yaffs_checkptrw

1.static int apply_chunk_offset(struct yaffs_dev *dev, int chunk) {return chunk ...

19880
来自专栏源哥的专栏

如何判断是关闭还是刷新网页

我们在写js代码的时候,经常要判断网页是否被关闭了,如果是被关闭了,就执行某段代码,这个可以用HTML的onbeforeunload事件来执行一段js代码,但是...

17140

扫码关注云+社区

领取腾讯云代金券