前言
本篇博客记录接口拦截器的实现效果。
流程
对token进一步优化,满足以下需求:
1.普通用户无法访问管理员的接口。
2.只有账号正常且登陆成功的用户才可以访问用户接口。
3.对管理员和普通用户做进一步的区分。
用户产生token:
access_token = create_access_token(
data={"sub": user.email, "index": 0}, expires_delta=access_token_expires # index索引是0代表用户,1代表管理员
)
管理员产生token:
access_token = create_access_token(
data={"sub": admin.id, "index": 1}, expires_delta=access_token_expires # index索引是0代表用户,1代表管理员
)
用户与管理员都使用相同的方法产生token,只是token产生的依据不一样。用户是邮箱+用户标志;管理员是id+管理员标志
管理员验证逻辑:
async def get_admin(token: str = Depends(oauth2_scheme)):
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Could not validate credentials",
headers={"WWW-Authenticate": "Bearer"},
)
try:
payload = jwt.decode(token, JWT_ARGS["secret_key"], algorithms=[JWT_ARGS["algorithm"]])
admin_id: str = payload.get("sub")
# print(payload.get("index"))
index: int = payload.get("index")
if not index:
raise credentials_exception
# token_data = TokenData(email=email)
except InvalidTokenError:
raise credentials_exception
with Session(engine) as session:
admin = session.query(Administrator).filter(Administrator.id == admin_id).first()
if admin is None:
raise credentials_exception
return admin
接口依赖注入:
管理员接口验证依赖注入:current_admin: Administrator = Depends(get_admin)
用户接口验证依赖注入:current_user: User = Depends(get_current_active_user
前端处理:
#使用localstorage存储token
localStorage.setItem('token', res.data.data.token)
- 在访问其他接口时,在前端进行处理,这样后续发送的请求头都带着token。
request.interceptors.request.use(function (config) {
if (localStorage.getItem('token') && localStorage.getItem('token') != "")
config.headers["Authorization"] = "Bearer " + localStorage.getItem('token')
return config
})
运行实例:
使用postman发送请求,检测拦截器是否成功运行。
- 普通用户登录获取token
- 不使用token访问管理员功能接口。
- 使用用户token访问管理员功能接口。
- 获取管理员接口。
- 使用管理员的token访问管理员功能接口。