JWT介绍

(jwt官方网址:https://jwt.io/)

授权认证是保护我们系统API资源的重要环节,如果不加授权认证那么你的API资源可以在网上被别人随便访问,JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。通俗地来讲,JWT是能代表用户身份的令牌,可以使用JWT令牌在api接口中校验用户的身份以确认用户是否有访问api的权限。JWT中包含了身份认证必须的参数以及用户自定义的参数,JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。

JWT结构:

①Header 头

②Payload 有效载荷

③Signature 签名

(一) Header:

 标头通常由两部分组成:令牌的类型,即JWT,以及正在使用的签名算法,例如HMAC SHA256或RSA。

例如:

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

(二)Payload:

Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。

  • iss (issuer):签发人

  • exp (expiration time):过期时间

  • sub (subject):主题

  • aud (audience):受众

  • nbf (Not Before):生效时间

  • iat (Issued At):签发时间

  • jti (JWT ID):编号

  除了官方字段,你还可以在这个部分定义私有字段,下面就是一个例子。例如:

{"sub": "1234567890","name": "John Doe","admin": true
}

  注意,JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。这个 JSON 对象也要使用 Base64URL 算法转成字符串。

(三)Signature:

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

  首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。

HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)

  签名用于验证消息在此过程中未被更改,并且,在使用私钥签名的令牌的情况下,它还可以验证JWT的发件人是否是它所声称的人。

            Visual Studio 2019开发工具进行JWT授权认证功能实现

一:创建asp.net core 应用程序

第一步:选择asp.net core web 应用程序 点击下一步。

0ff62ae8efbd2d902874eb29ec47ee6b.png

第二步:输入项目名称和解决方案名称(注:名称不要输入中文,以免发生错误)

63cca463ba9993519dfd3678338b49db.png

第三步:这里我们使用的是asp.net core 3.1版本,然后选择API,这里我们把https这个选项勾掉,然后点击创建。

1c2797089f66a7f2c5c15bd1b2fee38d.png

这里创建完成之后大概是这个样子的

dbf9719d72134b46b96e5fdde8eae303.png

第四步:首先,我们创建一个Const类来保存我们的密钥和颁发者地址,密钥是用生成工具生成的这里是写死的,这两个参数还可以写在我们的配置文件里launchSettings.json),这里只是一个简单的实现就不做那么细致了。

9495424d9fd1774929dd71e20ce6276c.png

第五步:添加一个AuthController,API控制器,这里主要是模拟我们的一个登录功能,这里只是简单的验证了一下密码是否为空,和是否是指定的用户和密码,验证通过后再去生成访问令牌。这里其实可以写一个单独的颁发令牌的API,当程序运行时首先访问这个API拿到token.

f61980b52f35db31771b84f7beb0d88f.png

第六步:在Startup.cs启动类中注入JWT服务,并且在中间件管道中启用Authenticaiton中间件,注意认证中间件UseAuthentication 要写在UseAuthorization前面

0704a0894a30f9e9d996659911797211.png

第六步:创建一个测试的API,其中一个方法打上权限校验特性标签。

9ab91f064458eb07ca6e9c28b8372587.png

测试

这里我们使用PostMan工具测试一下,首先在再未授权的情况下请求API,可以看到的是,状态码为401,提示我们Unauthorized,未授权。

1827c4a1056339e3c3d377fcb1cb434c.png

接下来我们使用模拟登录一下,先拿到TOKEN,再去访问API,这里我没有添加用户名和密码所以提示我们用户名或密码不正确。

d54f79302b5a74eab6035a63062f31e4.png

然后我们在请求体中在参数中添加上我们的用户名(uname)和密码(pwd)并且给上正确的值,最后我们成功的拿到了我们访问令牌(Token)

示例:

{

    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOiIxNTkyMDk3NDUzIiwiZXhwIjoxNTkyMDk5MjUzLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoidGlhbiIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6NTAwMCIsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6NTAwMCJ9.itzJhSLbIckTp_VM71Za4K20Ng0lAqeGlAZQ2zVmHEQ"

}

f60bb03a7a154c037db48553eda42d37.png

我们拿着Token 去请求刚才的API,首先我们要在授权体里面插入我们的Token值,这里Postman授权类型选择Bearer Token

8d40033ff779415d6306990f33176521.png

现在我们看到了我们的状态码是200,提示是OK,代表着我们已经通过授权认证并且拿到了返回值。

返回值示例:

[

    "value",

    "这是通过授权认证的值"

]

b5f11516c0d69ca1ffc581c051fb7d40.png

好了,今天的教程就到这里,如果你喜欢的话记得关注我的公众号,然后点击在看,记得帮我宣传宣传哟,谢谢!5c203c476332ffe9c0c6860adadf876c.png5c203c476332ffe9c0c6860adadf876c.png5c203c476332ffe9c0c6860adadf876c.png

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐