`
cuiyadll
  • 浏览: 203689 次
文章分类
社区版块
存档分类
最新评论

使用Json Web Token设计Passport系统

 
阅读更多
http://www.cnblogs.com/binyue/p/4812798.html

使用Json Web Token设计Passport系统

一、Token Auth机制
基于Token的身份验证是无状态的,我们不将用户信息存在服务器或Session中。

相比原始的Cookie+Session方式,更适合分布式系统的用户认证,绕开了传统的分布式Session一致性等问题。

基于Token的身份验证的主流程如下:

用户通过用户名和密码发送请求;
程序验证;
程序返回一个签名的token 给客户端;
客户端储存token,并且每次用于每次发送请求。

二、相比Cookie认证的优势
支持跨域跨站点访问:

Cookie是不允许垮域访问的,可以通过设置顶级域名的方式实现部分跨域,但是跨站点的访问仍然不支持,
如果使用Token机制,就可以通过HTTP头传输用户认证信息,从而更好的实现跨域跨站点。

无状态:

Token机制在服务端不需要存储session信息,Token自身包含了登录用户的信息,只需要在客户端的cookie或本地介质存储状态信息;

去耦:不需要绑定到一个特定的身份验证方案。Token可以在任何地方生成,只要在你的API被调用的时候,你可以进行Token生成调用即可;

更适用于移动应用:

当客户端是原生应用时,Cookie是不被支持的,虽然目前Webview的方式可以解决Cookie问题,

但是显然采用Token认证机制会简单得多;

安全性更强:

因为不再依赖于Cookie,所以你就不需要考虑对CSRF(跨站请求伪造)的防范;

标准化易扩展:

可以采用标准化的 JSON Web Token (JWT),对以后系统接入Node等纯前端开发更便捷;

相比Session一致性提高性能:

相比服务端保存Session一致性信息,并查询用户登录状态,一般来说Token的验证过程(包含加密和解密),性能开销会更小。

三、JSON Web Token标准的设计
JWT 标准的 Token 有三个部分:

header.payload.signature



三个部分中间用点分隔开,并且都使用 Base64 编码,所以生成的 Token 类似这样:

ewogICJ0eXAiOiAiSldUIiwKICAiYWxnIjogIkhTMjU2Igp9.ewogImlzcyI6ICJjaGJsb2dzLmNvbSIsCiAiZXhwIjogIjE0NzA3MzAxODIiLAogInVpZCI6ICIxMjM0NWFiY2RlIiwKfQ.9q2eq8sa374ao2uq9607r6qu6

(1)Header报头

header 部分主要包括两部分,一个是 Token 的类型,另一个是使用的算法,
比如下面类型就是 JWT,使用的算法是 HS256。

{
"typ": "JWT",
"alg": "HS256"
}

Header内容要用 Base64 的形式编码,所以就变成这样:
ewogICJ0eXAiOiAiSldUIiwKICAiYWxnIjogIkhTMjU2Igp9

(2)Payload载荷部分

Payload 里面是 Token 的具体内容,这部分内容可以自定义,JWT有标准字段,也可以添加其它需要的内容。
标准字段:
iss:Issuer,发行者
sub:Subject,主题
aud:Audience,观众
exp:Expiration time,过期时间
nbf:Not before
iat:Issued at,发行时间
jti:JWT ID

这是一个典型的payload信息,包含了发行者(网站)、过期时间和用户id:
{
"iss": "chblogs.com",
"exp": "1470730182",
"uid": "12345abcde",
}

这部分内容同样要用Base64 编码,生成编码类似如下格式:

ewogImlzcyI6ICJjaGJsb2dzLmNvbSIsCiAiZXhwIjogIjE0NzA3MzAxODIiLAogInVpZCI6ICIxMjM0NWFiY2RlIiwKfQ==

(3)Signature签名部分

签名部分主要和token的安全性有关,Signature的生成依赖前面两部分。
首先将Base64编码后的Header和Payload用.连接在一起,

ewogICJ0eXAiOiAiSldUIiwKICAiYWxnIjogIkhTMjU2Igp9.ewogImlzcyI6ICJjaGJsb2dzLmNvbSIsCiAiZXhwIjogIjE0NzA3MzAxODIiLAogInVpZCI6ICIxMjM0NWFiY2RlIiwKfQ


对这个字符串使用HmacSHA256算法进行加密,这个密钥secret存储在服务端,前端不可见,

1
2
3
4
5
6
String str="ewogICJ0eXAiOiAiSldUIiwKICAiYWxnIjogIkhTMjU2Igp9."
                + "ewogImlzcyI6ICJjaGJsb2dzLmNvbSIsCiAiZXhwIjogIjE0NzA3MzAxODIiLAogInVpZCI6ICIxMjM0NWFiY2RlIiwKfQ";
        byte[] inputData = str.getBytes();
        String key = Coder.initMacKey();
        BigInteger sha = new BigInteger(Coder.encryptHMAC(inputData, key));
        System.out.println("HS256加密后——"+sha.toString(32));
  


下面使用密钥 THISSHA 进行加密:
9q2eq8sa374ao2uq9607r6qu6

然后将Signature和前面两部分拼接起来,得到最后的token:

ewogICJ0eXAiOiAiSldUIiwKICAiYWxnIjogIkhTMjU2Igp9.ewogImlzcyI6ICJjaGJsb2dzLmNvbSIsCiAiZXhwIjogIjE0NzA3MzAxODIiLAogInVpZCI6ICIxMjM0NWFiY2RlIiwKfQ.9q2eq8sa374ao2uq9607r6qu6

四、JWT认证的实现
常规的token保存在sessionStorage或者localStorage中,每次请求时将token加在http请求的Header中,

下面是典型的token认证方式:

1.客户端登录时通过账号和密码到服务端进行认证,认证通过后,服务端通过持有的密钥生成Token,Token中一般包含失效时长和用户唯一标识,如用户ID,服务端返回Token给客户端;
2.客户端保存服务端返回的Token;
3.客户端进行业务请求时在Head的Authorization字段里面放置Token,如:
Authorization: Bearer Token
4.服务端对请求的Token进行校验,如果Token不是存放在Cookie中,需要解决用户主动注销,但设置的过期时间并未过期问题。

用户注销时可以把还在失效内的Token储存在Redis等缓存中,验证时查找Token是否存在,如果Token在Redis中存在,则说明用户已注销;如果Token不存在,则校验通过。
5.服务端可以通过从Token取得的用户唯一标识进行相关权限的校验,并把此用户标识赋予到请求参数中,业务可通过此用户标识进行业务处理;


还有一种方式是把token保存在Cookie中,这时就不需要在服务端保存token的值,用户注销时直接清除Cookie就可以,

这种方式不需要在服务端储存token的值,认证过程如下:




五、JWT标准的安全性
(1)如何访问CSRF攻击



CSRF (Cross Site Request Forgery),指在一个浏览器中打开了两个标签页,其中一个页面通过窃取另一个页面的 cookie 来发送伪造的请求,因为 cookie 是随着请求自动发送到服务端的。

(2)如何保证token的安全性

客户端不需要持有密钥,由服务端通过密钥生成Token;

在JWT中,不应该在Payload里面加入任何敏感的数据,如用户密码等信息,因为payload并没有做加密,只是一个Base64的编码,
攻击者拿到token以后就可以得到用户敏感信息;



参考资料:

基于 Token 的身份验证

JSON Web Token - 在Web应用间安全地传递信息
分享到:
评论

相关推荐

    Laravel开发-laravel_access_token

    1. JSON Web Tokens (JWT):Passport支持JWT作为访问令牌,它们具有自包含和安全的特性。 2. 个人访问令牌:允许用户生成长期有效的令牌,用于个人访问自己的API资源。 3. 授权码和客户端凭证流:除了密码授予,...

    Laravel开发-passport-mongodb

    这包括客户端管理、个人访问令牌、令牌撤销以及JSON Web Token (JWT)的支持。通过Passport,开发者可以轻松地实现用户授权,确保API的安全性。 接下来,我们关注与MongoDB的集成。Laravel默认使用Eloquent ORM,它...

    前端开源库-passport-jwt

    `Passport-JWT` 是一个专为前端开发者设计的开源库,它利用了JSON Web Token(JWT)的技术来实现高效且安全的身份验证策略。JWT是一种轻量级的认证和授权机制,广泛应用于API接口、单页面应用(SPA)和其他分布式...

    Laravel开发-passport-auth-proxy

    而“Laravel开发-passport-auth-proxy”则是一个扩展库,它作为Laravel Passport身份验证的代理,专门用来生成JSON Web Token (JWT)的访问和刷新令牌。这个库的目的是将Passport的认证功能与JWT的优势相结合,提供更...

    token_auth_passport:使用Node.js,Passport.js和JWT使用令牌认证的项目,以便生成可以根据每个用户的请求在API中进行验证的令牌

    **标题解析:** ...总结来说,"token_auth_passport"项目提供了一个使用Node.js、Passport.js和JWT的示例,展示了如何在实际应用中实施安全的令牌认证机制,这对于理解Web服务安全和API设计有重要的参考价值。

    Laravel开发-passport 构建 OAuth2 服务器 .zip

    4. **JSON Web Token (JWT) 支持**:虽然Passport默认使用传统的HTTP-only cookie,但可以通过配置启用JWT,为你的API提供更灵活的认证方式。 5. **中间件**:Passport提供了丰富的中间件,如`auth:api`,用于保护...

    Laravel开发-passport-auth-proxy .zip

    要实现授权代理,你需要在Laravel应用中创建一个新的中间件,这个中间件会检查请求中的认证信息,如JWT(JSON Web Token)或其他自定义凭证。一旦用户身份被验证,中间件会使用Passport的`fromUser()`方法创建一个新...

    Laravel开发-laravel-passport

    Passport还支持JSON Web Token(JWT)认证,这是一种更轻量级的身份验证方法。虽然Passport默认使用数据库存储的令牌,但通过配置,可以与JWT库集成,如JWT-auth或Tymon/jwt-auth。 为了实现API的权限控制,...

    Laravel开发-token-auth

    6. **JWT (JSON Web Tokens)**: Laravel也有社区维护的JWT库,如`tymon/jwt-auth`,它提供了一种轻量级的令牌认证方案。JWT包含所有必要的用户信息,可以在服务器之间安全地传输,无需查询数据库。 7. **Rate ...

    jwt-passport:使用JWT进行会话的Passport.js框架

    因此,它不是将用户的ID和元数据存储在数据库(例如Redis)中,而是将数据编码为JSON Web令牌并将该令牌写入会话cookie。 如何安装 $ npm install jwt-passport 注意:它需要Node.js 6.11或更高版本 如何使用 ...

    Laravel开发-passport-extended

    5. **集成第三方库**:Passport-Extended可能集成了其他流行的认证库,如JWT(JSON Web Tokens),以便于与现有系统的集成。 6. **增强的令牌审计**:提供更详细的令牌日志和审计功能,有助于追踪和管理令牌的生命...

    nest框架的token登录,以及token校验

    在Nest.js中实现token登录和token校验是常见的身份验证策略,特别是使用JSON Web Tokens(JWT)时。JWT是一种轻量级的身份验证机制,它允许服务器通过一个紧凑的、自包含的方式来安全地传输信息作为访问令牌。 ### ...

    Laravel开发-passport-custom-jwt-claims

    而"Passport-custom-jwt-claims"则是关于如何自定义Passport生成的JSON Web Token (JWT)中的声明(Claims)的主题。在本文中,我们将深入探讨这一主题,了解为何以及如何自定义这些声明,以满足特定的业务需求。 一...

    简单的blog文章管理系统,带有登录注册、权限区别、分页搜索

    用户数据可能存储在MongoDB、MySQL或其他数据库中,通过JSON Web Token(JWT)或Session进行身份验证。JWT是一种安全的身份验证方法,可以跨多个请求验证用户身份,而Session则在服务器端存储用户状态,通常用于维护...

    ChristmasList-Vue-Express-Passport:一个 Vue.jsExpress.js Web 应用程序,用于通过从产品目录中搜索项目来创建圣诞节列表并将这些项目保存到 MySQL 数据库上的列表该应用程序还具有用于注册和登录的“用户身份验证”,由 Passport 和 JSON Web Tokens (JWTs) 提供支持)

    此应用程序还具有用于注册和登录的User Authentication ,由Passport和JSON Web Tokens (JWTs) 该应用程序的工作版本可以在找到 演示文件可找到 发展的动力 随着一年中的送礼时间临近,我们希望帮助人们送出和获得...

    Laravel开发-passport-jwt-claims

    然而,有时我们可能需要在访问令牌(Access Token)中包含更多的自定义信息,这就是JWT(JSON Web Tokens)声明的作用。在本教程中,我们将深入探讨如何在Laravel的Passport中实现自定义JWT声明。 首先,让我们理解...

    无标题auth-master

    4. **JSON Web Token (JWT)**:JWT是一种轻量级的身份验证和授权机制,它将用户信息编码为一个令牌,可以在客户端和服务器之间安全传递,减少了频繁的服务器查询。 5. **Express.js或类似的Web框架**:项目可能使用...

    MoneyManage-Vue-Express-MongoDB:Express-Mongose-Vue-Money管理

    json web token 流程 1.引入所需要的包 passport passport-jwt jsonwebtoken 2.login成功,返回token,jwt.sign生成token token:组成 // header { "alg":"HS256", "type":"JWT" } // payload { "id":1, "name":...

    Laravel开发-passportrs

    2. **JWT(JSON Web Tokens)与Passport**: 虽然Passport主要处理OAuth2,但它也支持JSON Web Tokens(JWT),这是一种轻量级的身份验证机制,用于在客户端和服务器之间安全地传递信息。 ### 二、安装与配置 1. **...

Global site tag (gtag.js) - Google Analytics