您的位置:

python实现jwt的简单介绍

本文目录一览:

26.FastAPI安全性

软件开发中,安全是永恒的话题,FastAPI作为一个优秀的Python Web开发框架,为用户提供了多种工具,帮助用户以标准的方式轻松快速地解决软件开发中的安全性。

FastAPI 的 fastapi.security 模块中为各种安全方案提供了一些工具,这些工具简化了这些安全机制的使用方法。

FastAPI提供的OAuth2PasswordBearer是使用 OAuth2的密码授权模式的Bearer Token(不记名 token) 。创建OAuth2PasswordBearer 实例需要接收URL作为参数。

客户端会向该 URL 通过表单的格式发送 username 和 password 参数,然后得到一个 token 值;OAuth2PasswordBearer 并不会创建相应的 URL 路径操作,只是指明了客户端用来获取 token 的目标 URL。

代码示例:

在上面的代码中, tokenUrl="token"指的token是相对 URL 。

此时访问,其返回结果:

上面的结果表明:访问的内容以及被保护,必须经过授权后才可以访问。

当获取到表单数据后,需要进行密码校验,一般情况下,我们都会考虑使用哈希密码,PassLib 是一个用于处理哈希密码的非常好的 Python 包,它支持许多安全哈希算法以及配合算法使用的实用程序。

具体passlib的使用方法可以查看其文档

下面的代码示例在上面代码的基础上增加用户登录及Token验证

启动应用并执行请求:

测试无效登录:

测试正常登录:

返回token,在Headers中使用token访问:

修改token后请求:

上面的代码如果去掉 await verify_token(token) 行,则:

curl -H "Authorization:Bearer u000010007" -i

会得到返回结果,原因是默认情况下,OAuth2PasswordBearer只负责请求头中是否具有Authorization:Bearer,如果有就会执行相应的请求,所以,为了验证Token的正确性,需要每个方法都执行相应的验证代码。

本例只作为例子,在实际开发中不会直接拿用户ID作为Token,为了提高系统的安全性,需要使用 JWT。下面我们就介绍 JWT。

JWT是一个将 JSON 对象编码为密集且没有空格的长字符串的标准。 具体学习和了解 JWT,请参考 。

需要提到的主要是 JWT中的sub,JWT 的规范中有一个 sub 键,值为该令牌的主题。使用它并不是必须的,但这是我们放置用户标识的地方,所以一般情况下,我们在sub中存放用户ID, 为了避免 ID 冲突,当为创建 JWT 令牌时,可以在 sub 键的值前加上前缀,例如 username:、userid:等。

在 Python 中生成和校验 JWT 令牌 ,可以使用PyJWT,也可以使用 python-jose 。我们在本例中使用 python-jose 来编写代码。

使用:

使用 JWT,需要在系统中添加一个SECRET_KEY变量,用于生成令牌,如:

以下代码在上面代码的基础上使用 JWT 令牌。

与前面的代码差别之处:

1.生成Token的函数:build_access_token

2.校验Token的函数:verify_token

3.登录函数:login

请求测试:

登录:

令牌访问:

错误的令牌访问:

在大部分应用程序中,当用户访问某个接口API的时候,都需要明确访问者的身份,所以在应用程序中需要随时获取当前用户,由于在 JWT 令牌的 sub 字段中已经保存了用户信息,所以获取当前用户只需要对令牌解码即可。

在上面的代码的基础上,增加两个函数,代码如下:

请求测试:

以上,我们完成了一个简单的安全性示例,FastAPI提供的安全性框架帮助我们节约了很多代码,但在实际开发中,我们常常使用微服务的方式来开发,对于鉴权最好设计独立的微服务进行处理。后面我们会展示一个采用FastAPI开发的鉴权微服务,以便在此基础上进行业务系统的开发。

k8s之 service account token

在前一篇 笔记 中我们验证了使用sa的token作为一种认证,向apiserver发送请求,这里简述下它的认证原理和流程。

首先得知道这种token称为JWT(json web token),可以参考 官网 介绍,而且这是一种 RFC 标准。

JWT是服务端发给客户端的一种加密凭证(通过RSA或者密码加密),客户端访问服务端(此不一定是发布凭证的服务端)时携带上这个凭证,服务端解密此凭证,验证通过就可以允许客户端访问。

在k8s中,使用RSA私钥/公钥进行加密和验证,kube-controller-manager,使用如下参数指定私钥,对token进行签名

kube-apiserver使用如下参数指定公钥,对token进行验证

JWT包含三部分,分别为: Header,Payload,Signature,之间用"."分隔,所以一般形式为xxx.yyy.zzz。

header

一般包含两部分, typ指定了类型,固定为"JWT",alg指定了签名算法, 比如HMAC SHA256 or RSA。

payload

定义了用户数据,有定义好的知名的 字段 ,也可以自定义字段

payload需要使用Base64Url 加密后,作为JWT的第二部分

Signature

签名这一步需要四个条件:Base64Url 加密后的header,Base64Url 加密后的paload,secret(可以是密码,也可以是RSA的私钥)和header中指定的加密算法。比如使用 RSASHA256 算法计算签名的公式如下:

上面公式执行时,大概分为两步:

最后将这三部分(都要经过base64加密)使用"."结合起来就是最终的token

上面只是简述原理和流程,这里实践如何生成JWT,如何验证JWT。

有两种方法来生成/验证JWT

a. 使用 jwt.io 官方提供的 图形界面

b. 使用第三方库,比如python中的jwt (pip install python-jwt 通过此命令安装)

生成JWT

在右侧的decoded下面的三个框分别填写header,payload和VERIFY SIGNATURE中的private key(对于k8s来说,私钥就是/etc/kubernetes/pkt/sa.key),最上面的Algorithm选择签名算法,这里选择rs256. 会自动在左侧的encoded框显示出生成的JWT,如下图

解密JWT

把JWT填写到左侧的encoded中,系统会自动识别出header和payload,因为他俩是base64加密的,直接解密即可,但是签名部分需要提供公钥才能进行验证,否则encoded框下面会显示红色的"Invalid Signature",只要把公钥(对于k8s来说,公钥就是/etc/kubernetes/pkt/sa.pub),填写到右侧decoded下面的VERIFY SIGNATURE框的public key处即可验证,如下图

没填写公钥时

填写正确的公钥后

如下是python脚本,使用jwt库生成JWT,并验证JWT

使用python3执行脚本(为什么使用python3?原因在下面),查看结果

使用python库时有两点需要注意

下面内容是python调试内容,可忽略。

sha256生成的hash值

(Pdb) p data

b'\x9e ,\x86\xd2g74\xed\xdbo\x14\xaa\x02b\xd6\x01a\xa6\xde\xfb\x82\xd0,\xe0\x14\xde\x82\xbe\xde\xed\x97'

(Pdb) len(data)

32

(Pdb) print(data.hex())

9e2a2c86d2673734eddb6f14aa0262d60161a6defb82d02ce014de82bedeed97

(Pdb) print(data)

b'\x9e ,\x86\xd2g74\xed\xdbo\x14\xaa\x02b\xd6\x01a\xa6\xde\xfb\x82\xd0,\xe0\x14\xde\x82\xbe\xde\xed\x97'

/usr/lib/python3/dist-packages/jwt/api_jws.py

alg_obj = self._algorithms[algorithm]

key = alg_obj.prepare_key(key)

signature = alg_obj.sign(signing_input, key)

js代码 这个jwt用python怎么实现.求解答

使用的是JWT,Go实现的,研究了一整天,这段代码帮...将python项目重构为java项目,过程中遇到了这个知识点...React+Nodejs+MySQL全栈开发入门 vue项目中...