因为期末考试加上种种原因,没有及时更新博客,趁着假期时间,将欠下的债补上。
在之前的博客系统代码中前端路由控制是通过登陆请求,成功返回uuid给前端,然后前端通过验证是否有uuid来实现前端路由的权限控制。在之后设计中,我意识到两个重要的问题
问题一: 当api获取方式只有我一个人知道的时候,这种api访问无控制问题或许无关紧要,但是当有其他人知道,并借此来攻击我的服务器,那么我的服务器就只能凉凉~~
问题二:博客的访问用户分为匿名访客、普通会员、管理员,不同角色可以访问api的权限是不同的,需要控制其访问
-
为什么使用jwt
当想到这种问题,却没有解决方案时,第一反应时在网上搜,庆幸的是(手动狗头),在我之前很多人遇到这种问题,并且有一套成熟的解决方案,那么就是oauth授权框架,它与本文jwt有一定联系,却不能相提并论,毕竟一个是协议,一个是框架,毕竟我只是一个小博客项目,没有精力也没有必要使用一整套框架,来实现一个小小的业务场景。所以我使用了jwt协议,来保障api的访问安全。
-
jwt协议
JSON Web Token (JWT)
JWT在标准中是这么定义的:
JWT是一种安全标准。基本思路就是用户提供用户名和密码给认证服务器,服务器验证用户提交信息信息的合法性;如果验证成功,会产生并返回一个Token(令牌),用户可以使用这个token访问服务器上受保护的资源。
一个token的例子:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
一个完整的token组成分为三部分它们由.分割:header、payload、Signature签名。具体jwt的知识请点击这个链接,阮一峰大佬 -
jwt具体实现
我选择了pyjwt库进行token的生成与解析 pyjwt文档
token的生成:
@staticmethod def encode_token(user_name): try: headers = { "typ": "JWT", "alg": "HS256", } payload = { "headers": headers, 'exp': datetime.utcnow() + timedelta(days=0, seconds=10), 'iat': datetime.utcnow(), 'iss': 'yker', 'data': { 'user_name': user_name } } return jwt.encode(payload, 'secret',