您当前的位置:首页 > 互联网教程

初学者,简陋版手写jsparser(一):生成token

发布时间:2025-05-21 21:46:36    发布人:远客网络

初学者,简陋版手写jsparser(一):生成token

一、初学者,简陋版手写jsparser(一):生成token

1、解析器主要分为两大步骤:生成token与生成抽象语法树AST。在着手进行解析器开发时,首先需要将JavaScript代码分解为一系列的token。

2、token的生成依赖于定义的关键词、特殊符号、标识符与字面量等元素。通过自定义规则,开发者能够按照需求生成相应token。

3、值得注意的是,生成token的步骤仅负责拆分代码,并不涉及语句、声明语句与表达式等更复杂组合体的构建。这意味着在解析过程中,基本语法单位(即token)的识别是解析器工作的初步阶段。

4、下面展示一段简陋版手写JS解析器中用于生成token的代码示例。此代码仅为示例用途,实际应用中可能需要根据具体需求进行调整与优化。

二、在nestjs中使用token登录验证

1、最近又有闲空继续完成我的项目了,今天把后台登录注册写了一下,用了传统的token登录!

2、英文版实在是看不懂,网上又全都是二手知识,感谢为Nestjs添砖加瓦的大佬们!

3、下面是我在ProcessOn上面简单的画了点图,其中一些细节被我省去了,大致是这样的:

4、客户端完成前端页面的检查无误后,向后端发送携带账号密码的请求,后端收到后去数据库查一下存不存在该用户,若存在则为该用户信息生成token,返回给前端,这时前端即可将token放在需要验证用户信息的API的请求头中,当用户请求需要验证用户信息的API时,该API首先将token解析出来,这其中包括验证token合法性、有效期等等,jwt是可逆的,解析后会还原出原信息,得到用户信息后即可作为操作数据库中该用户的条件。

5、这其中有私钥是在后端,后端通过私钥和载荷生成token,验证时后端通过私钥和token进行解析。

6、一些模块为繁琐的验证过程提供了优雅的解决方案,在Nestjs中,我们可以通过文档中所给的Passport来将流程简化,该模块可以自定义策略,以实现自定义验证,像是设计模式中的模板模式,一些方法已经写好了,你可以选择性的覆盖。

7、首先划分区块,验证权限和单纯地获取用户信息这两个板块应该是放在不同的module里,而不是一股脑写在user里,所以我将auth单独抽离出来。

8、在auth.controller.ts中添加login接口,在进入login控制层之前,有Passport插件为我们验证好了用户信息,可以直接从request中获取。

9、在auth.service.ts中,login方法创建token后返回,简单直接,这里的JwtService和userService通过声明依赖注入进来,具体看auth.module.ts

10、在auth.module.ts中,注入其依赖的模块

11、在local.strategy.ts中,我们要验证用户信息的合法性,passport-local是用来验证用户信息的策略。

12、为了让策略生效,我们需要添加guard,在guards/local-auth.guard.ts

13、这样,一个登录接口就写好了,如果密码正确,便会返回token和简短的用户信息:

14、比如之前auth.controller.ts中的profile接口:

15、使用路由守卫JwtAuthGuard,这个是jwt策略,这个策略已经实现对token的验证和解析,如果有一环出错会直接返回异常,不需要我们编写验证逻辑。在strategy/jwt.strategy.ts:

16、同样,添加到路由守卫中,在guards/jwt-auth.guard.ts:

17、刚看可能会很懵,如果直接手写倒也没这么多事,不得不说Nestjs不愧是个框架,强制让我用洋葱皮,模块化的方式写业务代码,可维护性和健壮性自然不必多说,又用了一些快速开发jwt验证的模块,我整个登录写下来基本可以说不用关心token的处理逻辑,总之体验很棒,除了有点费眼,来回找文件。。。

三、NodeJS中使用token

Token指访问资源的凭据,是一种身份认证的方式,它是解决跨域认证的最流行的一种方式。

以前较为流行的是通过session去做身份认证,session是通过服务器中保存会话数据来做身份认证,这种方式会导致在高并发中服务器压力过大的情况,还有就是,如果是服务器集群,那么就需要这些服务器session共享。

Token不在服务器中保存会话数据,而是保存在客户端。每次请求的headers中存入Token,在服务器中判断Token的有效性,是否可以访问资源。

内部包含有签名算法、Token类型,然后通过base64url算法转成字符串

内部包含JWT标准数据和自定义数据,然后通过base64url算法转成字符串

注意:由于JWT是默认不加密的,所以在这边不要存敏感信息

这部分是对前两部分的签名,防止数据的篡改。

secret是服务器端保存的密钥,只有服务器端知道,再使用header中所指定的签名算法对上面的俩部分进行签名,按照以下公式生成签名。

算出签名之后,把三部分通过.分隔开返回给用户就行了

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTAsIm5hbWUiOiLlvKDkuIkiLCJhZ2UiOjE2LCJpYXQiOjE1ODgxMzkzMjMsImV4cCI6MTU4ODEzOTMzM30.WzZp_aNgiw4iTsX7buxMhZe0z0e94Ve6ImEZ8L8L78c

每次客户端的请求都需要带上这个token,一般是把token写入到请求的headers中

通过npm包jsonwebtoken来完成token的生成和验证