nestjs 使用jwt实现认证

JavaScript010

nestjs 使用jwt实现认证,第1张

JSON WEB TOKEN 用来解决跨域认证的问题,服务器认证后,生成JSON对象返回给客户端,服务器不保存session数据,所有数据都保存在客户端,每次请求都发回给服务器.

http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

官方规定了7个官方字段

除了官方字段,可更具自己的服务自定义字段如:

对前面两个部分的签名。防止数据被篡改。使用header中指定的签名算法(默认是HMAC SHA256),按照下面的公式产生签名

user.controller.ts

auth.service.ts:

auth.module.ts

jwt.strategy.ts:

参考:

https://juejin.im/post/6844904097317912584

<%@ page contentType="text/htmlcharset=gb2312"%>

<script language="JavaScript">

function isValidate(form)

{

// 得到用户输入的信息

userid = form.userid.value

username = form.username.value

userpass = form.userpass.value

userpass2 = form.userpass2.value

birthday = form.birthday.value

email = form.email.value

address = form.address.value

phone = form.phone.value

// 判断用户ID长度

if(!minLength(userid,6))

{

alert("用户ID长度小于6位!")

form.userid.focus()

return false

}

if(!maxLength(userid,8))

{

alert("用户ID长度大于8位!")

form.userid.focus()

return false

}

// 判断用户名长度

if(!minLength(username,6))

{

alert("用户名长度小于6位!")

form.username.focus()

return false

}

if(!maxLength(username,8))

{

alert("用户名长度大于8位!")

form.username.focus()

return false

}

// 判断口令长度

if(!minLength(userpass,6))

{

alert("口令长度小于6位!")

form.userpass.focus()

return false

}

if(!maxLength(userpass,8))

{

alert("口令长度大于8位!")

form.userpass.focus()

return false

}

// 判断用户名和口令是否相同

if(username==userpass)

{

alert("用户名和口令不能相等!")

form.userpass.focus()

return false

}

// 验证两次口令是否相同

if(userpass != userpass2)

{

alert("两次输入的口令不相同!")

form.userpass.focus()

return false

}

// 验证生日的格式是否正确

if(!isDate(birthday))

{

alert("生日的格式不正确!")

form.birthday.focus()

return false

}

// 验证email的格式是否正确

if(!isEmail(email))

{

alert("Email格式不正确!")

form.email.focus()

return false

}

// 验证电话号码的格式是否正确

if(!isDigital(phone))

{

alert("电话号码的格式不正确")

form.phone.focus()

return false

}

// 验证地址的长度是否正确

if(!maxLength(address,50))

{

alert("地址长度大于50位!")

form.address.focus()

return false

}

return true

}

// 验证是否是空

function isNull(str)

{

if(str.length==0)

return true

else

return false

}

// 验证是否满足最小长度

function minLength(str,length)

{

if(str.length>=length)

return true

else

return false

}

// 判断是否满足最大长度

function maxLength(str,length)

{

if(str.length<=length)

return true

else

return false

}

// 判断是否是数字

function isDigital(str)

{

for(i=0i<str.lengthi++)

{

// 允许使用连字符

if(str.charAt(i)>='0' &&str.charAt(i)<='9'

|| str.charAt(i)=="-" &&i!=0 &&i!=str.length-1)

continue

else

return false

}

return true

}

// 判断是否是整数

function isNumber(str)

{

for(i=0i<str.lengthi++)

{

// 如果要判断小数,需要判断小数点

if(str.charAt(i)>='0' &&str.charAt(i)<='9'

|| str.charAt(i)=="-" &&i==0)

continue

else

return false

}

return true

}

// 判断是否是日期,日期的格式为1988-1-1

function isDate(date)

{

// 查找分隔符

index1 = date.indexOf("-")

// 如果分隔符不存在,则不是合法的时间

if(index1 == -1)

return false

// 获取时间中的年

year = date.substring(0,index1)

// 获取时间中的剩下部分

date = date.substring(index1+1)

// 查找第二个分隔符

index1 = date.indexOf("-")

// 如果不存在第二个分隔符,则不是合法的时间

if(index1 == -1)

return false

// 获取时间中的月份

month = date.substring(0,index1)

// 获取时间中的日

day = date.substring(index1+1)

// 判断是否是数字,如果不是则不是合法的时间

if(isNumber(year) &&isNumber(month) &&isNumber(day))

{

// 判断基本范围

if(year<1900 || year>9999 || month<1 || month >12 || day<1)

return false

// 判断31天的月

if((month==1 || month==3 || month==5 || month==7

|| month==8 || month==10 || month==12) &&day>31)

return false

// 判断30天的月

if((month==4 || month==6 || month==9 || month==11)

&&day>30)

return false

// 如果是2月,判断是否为润年

if(month==2)

{

if(year%400==0 || (year%4==0 &&year%100!=0))

{

if(day>29)

return false

}else

{

if(day>28)

return false

}

}

}

else

return false

return true

}

// 判断是否是Email

function isEmail(email)

{

if(email.length==0)

return false

index1 = email.indexOf('@')

index2 = email.indexOf('.')

if(index1 <1 // @符号不存在,或者在第一个位置

|| index2 <1 // .符号不存在,或者在第一个位置

|| index2-index1 <2// .在@的左边或者相邻

|| index2+1 == email.length) // .符号后面没有东西

return false

else

return true

}

</script>

<html>

<head>

<title>注册界面</title>

</head>

<body>

<h2 align="center">请注册</h2>

<form action="register_confirm.jsp" method="get"

isValidate(form1)">

<table align="center">

<tr><td>用户ID:</td><td><input type="text" value="zhangsan">6-8位</td></tr>

<tr><td>用户名:</td><td><input type="text" ></td></tr>

<tr><td>口令:</td><td><input type="password" ></td></tr>

<tr><td>确认口令:</td><td><input type="password" ></td></tr>

<tr><td>生日:</td><td><input type="text" >格式为:1988-1-1</td></tr>

<tr><td>学历:</td><td>

<input type="radio" value="专科">专科

<input type="radio" value="本科" checked>本科

<input type="radio" value="硕士研究生">硕士研究生

<input type="radio" value="博士研究生">博士研究生

<input type="radio" value="其他">其他</td></tr>

<tr><td>地区:</td><td>

<select >

<option value="华东">华东</option>

<option value="华南">华南</option>

<option value="华北">华北</option>

<option value="东北" selected>东北</option>

<option value="东南">东南</option>

<option value="西南">西南</option>

<option value="西北">西北</option>

<option value="东北">东北</option>

<option value="华中">华中</option>

</select></td></tr>

<tr><td>E-mail:</td><td><input type="text" ></td></tr>

<tr><td>地址:</td><td><input type="text" ></td></tr>

<tr><td>电话:</td><td><input type="text" ></td></tr>

<tr><td>备注:</td><td>

<textarea rows="8" cols="40" value="1222222"></textarea></td></tr>

<tr><td><input type="reset" value="重置"></td><td>

<input type="submit" value="提交"></td></tr>

<table>

</form>

</body>

</html>

没听说过有js的认证...我的理解是这样的:一般有认证考试的技术都是某家公司的技术,比如原来sun的java认证,microsoft的.net认证,oracle的认证等等,一般都是公司为了推广其技术而设置的,而js本质上市ECMA组织提出的标准,然后各个厂商实现这样的标准,各厂商的实现可能还会有区别,所以没有这样的认证... 另外,js也不是什么小打小闹的东西,其中也包含了很多东西,如果学好了也会有很深的造诣