web权限验证方法说明[转载]
前言
本文将会从最基本的一种web权限验证说起,即HTTP Basic authentication,然后是基于cookies和tokens的权限验证,最后则是signatures和一次性密码。
HTTP Basic authentication
当客户端发起一个请求时,它可以使用HTTP Basic authentication来提供一个用户名和密码,来进行权限验证。
由于它不依赖于cookies,sessions等任何外部因素,所以它是最简单的权限验证方法。在使用它时,客户端需要在每次请求时,都附带上Authorization请求头,用户名和密码都不会被加密,但是需要被格式化为以下结构:
用户名和密码由一个冒号连接,如
username:password这个字符串需进行Base64编码
Basic关键字需被放置在这个编码后的字符串的前面
例子:
curl --header "Authorization: Basic am9objpzZWNyZXQ=" my-website.com
在Node.js中实现它是非常简单的,以下是一个通过Express中间件来实现的例子:
import basicAuth from 'basic-auth';
function unauthorized(res) {
res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
return res.send(401);
};
export default function auth(req, res, next) {
const {name, pass} = basicAuth(req) || {};
if (!name || !pass) {
return unauthorized(res);
};
if (name === 'john' && pass === 'secret') {
return next();
}
return unauthorized(res);
};
当然,你也可以在更高层上实现它,如nginx。
HTTP Basic authentication虽然十分简单,但仍有一些需要注意的地方:
用户名和密码在每次请求时都会被带上,即使请求是通过安全连接发送的,这也是潜在的可能暴露它们的地方。
如果网站使用的加密方法十分弱,或者被破解,那么用户名和密码将会马上泄露。
用户通过这种方式进行验证时,并没有登出的办法
同样,登陆超时也是没有办法做到的,你只能通过修改用户的密码来模拟。
Cookies
当服务端在响应HTTP请求时,它可以在响应头里加上Set-Cookie头。然后浏览器会将这个cookie保存起来,并在以后请求同源的地址时,在Cookie请求头中附上这些cookie。
当使用cookies来进行权限验证时,有以下几点需要注意。
总是将cookies设为HttpOnly
当设置cookies时,总是使用HttpOnly标识,这样以来cookies就不能通过document.cookies获取,用以减少被XSS攻击可能性。
总是使用签名(signed) cookies
当使用签名cookies时,服务器则可以判断该cookie是否被客户端更改过。
不足:
需要花费额外的功夫来抵御CSRF攻击
与REST风格不匹配。因为它在一个无状态协议里注入了状态。
Tokens
现今,JWT(JSON Web Token)无处不在。让我们先来看看它到底长什么样。
JWT由三部分组成:
Header,由token的类型和哈希算法组成Payload,包含了内容主体Signature,当你选择HMAC SHA256算法时,它由HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)计算得出。
将你的Koa应用加上JWT仅需几行代码:
var koa = require('koa');
var jwt = require('koa-jwt');
var app = koa();
app.use(jwt({
secret: 'very-secret'
}));
// Protected middleware
app.use(function *(){
// content of the token will be available on this.state.user
this.body = {
secret: '42'
};
});
例子:
curl --header "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ" my-website.com
如果你在写提供给原生移动应用或单页web应用的API,JWT是一个不错的选择。
不足:
需要额外的措施来防护XSS攻击
Signatures
不论是使用cookies还是token,如果你传输的内容被他人截获,那么它们将可以很容易得伪装成真实的用户。
如果解决这个问题?当我们讨论的是API之间的通信,而不是浏览器之间的通信时,有一个办法。
当API的消费者发送一个需要权限验证的请求时,你可以对整个请求用一个私钥进行哈希。你可以使用的请求的内容有:
HTTP方法
请求路径
HTTP头
HTTP体
以及一个私钥
API的消费者和提供者都必须持有相同的私钥。在生成了signature之后,你必须将其加在query string或HTTP头中。另外,还需附上一个时间戳,用于判断过期。
当这么做时,即使你传输的内容暴露了,攻击者也无法伪装成真实用户,因为它无法自己生成signature。
不足:
不能用于浏览器/客户端中,只能用于API之间的通信中。
一次性密码
一次性密码算法使用一个共享的密钥和一个当前时间戳或计数器来生成一个一次性密码:
基于时间的一次性密码算法,使用一个当前时间的时间戳
基于HMAC的一次性密码算法,使用一个计数器
这些方法被用于双重认证(two-factor authentication)中:一个用户输入了用户名和密码,然后服务器和客户端同时生成一个一次性密码。
在Node.js中,使用notp实现它是相对简单的。
不足:
如果共享密钥被窃取,那么用户的token将可以被伪造
该在何时选择何种验证方法?
如果你只需支持一个web应用,那么cookies和tokens的实现都是可以的(cookies对XSRF的防护较好,而JWT则更易于防护XSS)。
如果你需要同时支持web应用和移动客户端,那么请使用基于token的验证。
如果你正在构建仅与其他API通信的API,那么就使用signatures。
最后
原文链接:https://blog.risingstack.com/web-authentication-methods-explained/
web权限验证方法说明[转载]的更多相关文章
- 基于 Annotation 拦截的 Spring AOP 权限验证方法
基于 Annotation 拦截的 Spring AOP 权限验证方法 转自:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilte ...
- 自定义shiro实现权限验证方法isAccessAllowed
由于Shiro filterChainDefinitions中 roles默认是and, admin= user,roles[system,general] 比如:roles[system,gener ...
- SharePoint2010基于表单验证方法总结(转载)
系统环境: win2008r2+ sql2008r2 +Visual Studio2010+sharepoint 2010 A.如果已经建立了web application 例如名字为: http: ...
- asp.net web api 权限验证的方法
思路:客户端使用header或者form讲验证信息传入api,在权限验证过滤中进行处理,代码示例: 定义过滤器 public class ApiFilter1 : System.Web.Http.Au ...
- [置顶] Web用户的身份验证及WebApi权限验证流程的设计和实现 (不是Token驗證!!!不是Token驗證!!!都是基於用户身份的票据信息驗證!!!)
转发 http://blog.csdn.net/besley/article/details/8516894 不是Token驗證!!!不是Token驗證!!!都是基於用户身份的票据信息驗證!!! [ ...
- ASP.NET MVC View 和 Web API 的基本权限验证
ASP.NET MVC 5.0已经发布一段时间了,适应了一段时间,准备把原来的MVC项目重构了一遍,先把基本权限验证这块记录一下. 环境:Windows 7 Professional SP1 + Mi ...
- asp.net获取当前页面文件名,参数,域名等方法。统一session验证和权限验证的方法
转:http://blog.csdn.net/llll29550242/article/details/6054323 ASP.net后台获取当前页面的文件名 System.IO.Path.GetFi ...
- 转 Web用户的身份验证及WebApi权限验证流程的设计和实现
前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个功能复杂的业务应用系统,通过角色授权来控制用户访问,本文通过Form认证,Mvc的Controller基类及Action的权 ...
- Web用户的身份验证及WebApi权限验证流程的设计和实现 asp.net mvc AllowAnonymous 不起作用, asp.net mvc 匿名访问
原文地址: https://blog.csdn.net/zjlovety/article/details/17095627 前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个 ...
随机推荐
- jQuery中的筛选(六)
1. eq(index|-index) 获取当前链式操作中第N个jQuery对象,返回jQuery对象,当参数大于等于0时为正向选取,比如0代表第一个,1代表第二个.当参数为负数时为反向选取,比如-1 ...
- 关于join的使用
一.join的作用 join() 定义在Thread.java中.join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行. // 主线程 public class Father exte ...
- 洛谷 P4316 绿豆蛙的归宿
洛谷 P4316 绿豆蛙的归宿 洛谷传送门 题目背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 题目描述 给出一个有向无环图,起点为1终点为N,每条边都有一个长度, ...
- 第九周周四计划&&周三总结
今天由于自己的原因进度不是很大,今天整理了一下全网关联的思路流程(个人可能就是那种没自信,在思路不知道对不对的情况下不敢下手那种渣渣),和之前的一个学长讨论了一下大概思路流程,如下: (1)使用LDA ...
- NG-ZORRO 使用相关
Upload上传 import { Component, Input, Output, EventEmitter, Inject } from '@angular/core'; import { Nz ...
- win10 去除快捷方式小箭头
@echo off color 2 reg delete HKCR\lnkfile /v IsShortcut /f reg delete HKCR\piffile /v IsShortcut /f ...
- [ZJOI2019] 开关 (一种扩展性较高的做法)
[ZJOI2019] 开关 (一种扩展性较高的做法) 题意: 有n个开关,一开始状态都为关闭.每次随机选出一个开关将其状态改变,选出第i个开关的概率为${ p_i \over \sum_{i=1}^n ...
- Python爬取信息管理系统计算学分绩点
试手登录了下我们学校的研究生信息管理系统,自动计算学分绩点 # -*- coding:utf-8 -*- import urllib import urllib2 import re import c ...
- 剑指offer:剪绳子(找规律,贪心算法,动态规划)
1. 题目描述 /* 题目描述 给你一根长度为n的绳子,请把绳子剪成m段(m.n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m].请问k[0]xk[1] ...
- Chrome保存整个网页为图片
打开需要保存为图片的网页 然后按F12,接着按Ctrl+Shift+P 在红框内输入full 点击下面的“Capture full size screenshot”就可以保存整个网页为图片了 原文出处 ...