使用JWT认证对LDAP服务进行身份验证

4 投票
1 回答
4097 浏览
提问于 2025-04-18 09:00

我正在创建一个使用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的代码应该可以和任何底层的后端兼容。

撰写回答