Python에서 LDAP인증을 사용할 수 있는 방법에 대한 조사 및 테스트

목적


이 문서의 목적은 Python에서 LDAP인증을 사용할 수 있는 방법에 대한 조사를 정리하고 기록하기 위해 작성했다. 

Python-ldap library


구글 검색 결과 시 첫번째로 나오는 LDAP Python library이다. 

공식 사이트를 참조하면 다음과 같이 사용 예를 제시하고 있다. 

import ldap
l = ldap.initialize("ldap://my_ldap_server.my_domain")
l.simple_bind_s("","")
l.search_s("o=My Organisation, c=AU", ldap.SCOPE_SUBTREE, "objectclass=*")

사용예에서 보듯이 simple_bind_s API를 통해 인증을 할 수 있다. 공식 문서의 설명은 다음과 같다.

LDAPObject.simple_bind_s([who=None[, cred=None[, serverctrls=None[, clientctrls=None]]]]) → None

After an LDAP object is created, and before any other operations can be attempted over the connection, a bind operation must be performed. This method attempts to bind with the LDAP server using either simple authentication, or Kerberos (if available). The first and most general method, bind(), takes a third parameter, method which can currently solely be AUTH_SIMPLE. serverctrls and clientctrls like described in section Arguments for LDAPv3 controls. The who and cred arguments are text strings; see The bytes mode. Changed in version 3.0: simple_bind() and simple_bind_s() now accept None for who and cred, too.

Python-ldap 공식사이트의 사용 예는 다음과 같다.

import ldap

con = ldap.initialize('ldap://localhost:389', bytes_mode=False)
con.simple_bind_s(u'login', u'secret_password')
results = con.search_s(u'ou=people,dc=example,dc=org', ldap.SCOPE_SUBTREE, u"(cn=Raphaël)")

Python-ldap을 활용한 간단 인증 테스트


Python-ldap을 활용해 사용자의 ID, PW 정보를 받아 인증하는 방법에 대해 테스트를 진행한다. 

테스트를 위해 아래와 같이 코드를 입력한다. 아래 코드는 Python-ldap API 중 simple_bind_s API를 이용해서 인증한다. 입력 후 결과를 확인한다. 

import ldap


def authenticate(ldap_object, ldap_address, user_name, password):
    try:
        print(ldap_object.simple_bind_s(user_name, password))
    except ldap.INVALID_CREDENTIALS:
       ldap_object.unbind()
       return 'Wrong username ili password'
    except Exception as e:
        print(e)
        return "error"

    return "Succesfully authenticated"


def initialize_ldap(ldap_address):
    ldap_object = ldap.initialize(ldap_address)
    
    return ldap_object


def main():
    ldap_address = "ldap://" # {address}
    user_name = "insert your email"
    password = "insert your password"

    ldap_object = initialize_ldap(ldap_address)
    print(authenticate(ldap_object, ldap_address, user_name, password))


if __name__ == '__main__':
    main()

성공 시 응답 메시지는 다음과 같다.

(97, [], 1, [])
Succesfully authenticated

실패 시 응답 메시지는 다음과 같다. 사용자아이디로 사용되는 이메일정보나 패스워드를 틀리게 입력하여 테스트하면 아래와 같은 메시지가 반환되는 것을 확인할 수 있다.

Wrong username ili password

테스트에서 사용된 코드를 기준으로 설명하자면, simple_bind_s 메소드에 전달된 크레덴셜정보가 LDAP에 존재하지 않거나 틀린 정보로 전달되면 INVALID_CREDENTIALS 예외가 발생된다.

참고 문서


참고한 문서들은 다음과 같다. 

태그:

카테고리:

업데이트:

댓글남기기