我有一个idenityserver4、一个前端angular应用程序和一个Django rest框架资源API。Angular应用程序如果未登录则无法访问,并重定向到identityserver4。用户必须在那里登录并重定向到前端。到目前为止,提供程序为前端提供了JWT访问令牌。
然后前端应用程序向提供JWT的DRF API请求资源。这就是我陷入困境的地方,我在谷歌上找到的所有教程都解释了如何创建自己的提供商。但我只想获得令牌,与身份服务器4核实它是否有效,对用户进行身份验证,提供资源
任何代码片段或库都将非常有用。
谢谢。
我遇到了一个类似的问题,但我还没有完全解决,但这可能会对你有所帮助。
它是一个权限类,只检查给定的jwt是否使用authlib正确编码和签名,从那里您可以访问令牌内部信息以进行进一步验证。
permissions.py:
from authlib.jose import jwt
from rest_framework import permissions
from rest_framework.exceptions import APIException
class TokenNotValid(APIException):
status_code = 403
default_detail = "Invalid or absent JWT token field."
class NoAuthHeader(APIException):
status_code = 403
default_detail = "Absent 'Authorization' header."
class ValidJWTPermission(permissions.BasePermission):
"""
Global permission check for JWT token.
"""
def _get_pubkey(self):
# You will probably need to change this to get the
# public key from your identity server and not from a file.
with open("../public.pem", "rb") as key_file:
pubk = key_file.read()
return pubk
def has_permission(self, request, view):
auth_header = request.META.get('HTTP_AUTHORIZATION')
# print("Received header:")
# print(auth_header)
if auth_header is None:
raise NoAuthHeader
try:
token = auth_header.split()[1]
# print("Encoded Token:")
# print(token)
dec_token = jwt.decode(token,self._get_pubkey())
except Exception:
# Probably should add proper exception handling.
raise TokenNotValid
# print("Decoded token:")
# print(dec_token)
return True
views.py:
from .permissions import ValidJWTPermission
class HelloView(APIView):
permission_classes = [ValidJWTPermission]
def get(self, request):
return HttpResponse("Hello, world. You're at the gerenciador index.")