使用JWT认证对LDAP服务进行身份验证
我正在创建一个使用JWT认证的网络服务,使用的是django-rest-framework-jwt。我希望我的用户能够用他们的LDAP账户进行认证。我发现Django有一个认证后端,可以对接LDAP服务。django-rest-framework-jwt中负责认证的函数是这样的:
def authenticate_credentials(self, payload):
try:
user_id = payload.get('user_id')
if user_id:
user = User.objects.get(pk=user_id, is_active=True)
else:
msg = 'Invalid payload'
raise exceptions.AuthenticationFailed(msg)
except User.DoesNotExist:
msg = 'Invalid signature'
raise exceptions.AuthenticationFailed(msg)
return user
这个函数会在用户模型中查找用户进行认证。我觉得即使我设置了LDAP后端,它也可能无法正常工作。我这样想对吗?如果是的话,我该怎么做才能同时使用JWT认证和LDAP服务进行认证呢?
1 个回答
6
每个Django的认证后端都有一个非常简单的接口。通常情况下,它们会被放在AUTHENTICATION_BACKENDS设置里,但你也可以手动使用它们:
from django_auth_ldap.backend import LDAPBackend
user = LDAPBackend().authenticate(username, password)
这里假设用户是通过用户名和密码来进行认证的。如果你需要通过其他方式,比如LDAP来认证,那你可能就得自己解决了。
需要记住的一点是,每个认证后端都会创建或返回相同的用户模型对象。所以假设一个用户已经通过认证,那么你基于用户ID的代码应该可以和任何底层的后端兼容。