Получить токены в DocuSign в Python - PullRequest
1 голос
/ 09 января 2020

Я работаю в проекте и пытаюсь получить токен доступа для использования API DocuSign, но вызов для получения oauth userinfo не работает.

Код:

class BaseDocusign:
    api_client = None
    _token_received = False
    expiresTimestamp = 0
    account = None

    def __init__(self):
        BaseDocusign.api_client = ApiClient()

    def token_is_expired(self):
        current_time = int(round(time.time()))
        return (current_time + DOCUSIGN_EXPIRE_TIME - 10) > BaseDocusign.expiresTimestamp

    def check_token(self):
        if not BaseDocusign._token_received or self.token_is_expired():
            self.update_token()

    def update_token(self):
        client = BaseDocusign.api_client
        client.request_jwt_user_token(
            DOCUSIGN_CLIENT_ID,
            DOCUSIGN_ACCOUNT_ID,
            DOCUSIGN_AUTH_SERVER,
            DOCUSIGN_PRIVATE_KEY,
            DOCUSIGN_EXPIRE_TIME
        )
        if BaseDocusign.account is None:
            account = self.get_account_info(client)
            print account

        BaseDocusign._token_received = True
        BaseDocusign.expiresTimestamp = (int(round(time.time())) + DOCUSIGN_EXPIRE_TIME)

    def get_account_info(self, client):
        client.host = DOCUSIGN_AUTH_SERVER
        response = client.call_api("/oauth/userinfo", "GET", response_type="object")

        if len(response) > 1 and 200 > response[1] > 300:
            raise Exception("can not get user info: %d".format(response[1]))

        accounts = response[0]['accounts']
        target = target_account_id

        if target is None or target == "FALSE":
            # Look for default
            for acct in accounts:
                if acct['is_default']:
                    return acct

        # Look for specific account
        for acct in accounts:
            if acct['account_id'] == target:
                return acct

        raise Exception("User does not have access to account {target}\n")

Когда я запускаю его:

a = BaseDocusign()
a.update_token()

Токен доступа генерируется:

{"access_token":"eyJ0eXAiOiJNVCIsImFsZyI6IlJTMjU2Iiwia2lkIjoiNjgxODVmZjEtNGU1MS00Y2U5LWFmMWMtNjg5ODEyMjAzMzE3In0.AQkAAAABAAsADQAkAAAAZjczYjYxMmMtOGI3Ny00YjRjLWFkZTQtZTI0ZWEyYjY4MTEwIgAkAAAAZjczYjYxMmMtOGI3Ny00YjRjLWFkZTQtZTI0ZWEyYjY4MTEwBwAAq89LFJXXSAgAAOvyWVeV10gLAB8AAABodHRwczovL2FjY291bnQtZC5kb2N1c2lnbi5jb20vDAAkAAAAZjczYjYxMmMtOGI3Ny00YjRjLWFkZTQtZTI0ZWEyYjY4MTEwGAABAAAABQAAABIAAQAAAAYAAABqd3RfYnI.f_XW63iL5ABts-gq48ciWKQnaYyNiIEG9rC_CpnyWo0Hzf-B_G3hIRUWJzD1Yiyyy4pKm_8-zoalsoqANcMeXsjwBTCMlXIhc216ZWa6nHR6CheRbfTHM6bJ1LKwRdmnpwLywu_qiqrEwEOlZkwH_GzSSP9piUtpCmhgdZY1GFnG2u9JU_3jd8nKN87PE_cn2sjD3fNMRHQXjnPeHPyBZpC171TyuEvQFKCbV5QOwiVXmZbE9Aa_unC-xXvvJ2cA3daVaUBHoasXUxo5CZDNb9aDxtQkn5GCgQL7JChL7XAfrgXAQMOb-rEzocBpPJKHl6chBNiFcl-gfFWw2naomA","token_type":"Application","expires_in":28800}

Но при попытке получить информацию об учетной записи, вызов не выполняется:

{"error":"internal_server_error","reference_id":"f20e360c-185d-463e-9f0b-ce95f38fe711"}

Для этого я вызываю функцию get_account_info, и она вызывает конечную точку oauth/userinfo, но вызов завершается неудачей.

response = client.call_api("/oauth/userinfo", "GET", response_type="object")
# Response: {"error":"internal_server_error","reference_id":"f20e360c-185d-463e-9f0b-ce95f38fe711"}

Для этого пример , я нужна переменная account_id и в соответствии с этим примером функция get_account_info получает ее.

Я также пытался сделать то, что web говорит (шаг 4), чтобы получить информацию о пользователе и Ответ:

curl --request GET https://account-d.docusign.com/oauth/userinfo--header "Authorization: Bearer eyJ0eXAiOiJNVCIsImFsZyI6IlJTMjU2Iiwia2lkIjoiNjgxODVmZjEtNGU1MS00Y2U5LWFmMWMtNjg5ODEyMjAzMzE3In0.AQoAAAABAAUABwAAYWSFlJrXSAgAAMko55ya10gCAP-ftnA70YROvfpqFSh7j7kVAAEAAAAYAAEAAAAFAAAADQAkAAAAZjczYjYxMmMtOGI3Ny00YjRjLWFkZTQtZTI0ZWEyYjY4MTEwIgAkAAAAZjczYjYxMmMtOGI3Ny00YjRjLWFkZTQtZTI0ZWEyYjY4MTEwEgABAAAABgAAAGp3dF9iciMAJAAAAGY3M2I2MTJjLThiNzctNGI0Yy1hZGU0LWUyNGVhMmI2ODExMA.YHFoD2mQbwh8rdiPi8swg9kO9srlDyJcpqUo8XI5tdZki2I_Nla-qb9VaD4gAy8tSXVSY7unRjfClFDAqC8Ur73caHuZo7tN5tIKmXi6C3VzPWPGFJtsceKNEGMqwznw6OBVuPQG0IGlRjXK37Ur1nILLUWKb7w6O5Uz6y0e5uR8sxzZWh1adm2zHqd6khiQuAFB9vG2sS3jaudtck1qV6HRB_kARvUie1zglvHydc42Nc_o5GtIm3sGrqW7rio3YpHVX39nTKM-28kjOvPSNwzXp3IlZtaxuB6EdexrECH19nIaNbCe29LrdpzreRMyjEwwM309bOaKJ1KV82NbTQ"

# Response
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="https://account-d.docusign.com/">here</a>.</h2>
</body></html>
curl: (3) URL using bad/illegal format or missing URL

Спасибо за все :)

Ответы [ 3 ]

1 голос
/ 09 января 2020

Просто глядя на код, возвращаемое значение - "acct", словарь. Поэтому вам нужно использовать account['account_id']

Я нашел этот полный пример: https://github.com/docusign/eg-01-python-jwt

И здесь: https://github.com/docusign/eg-01-python-jwt/blob/master/example_base.py#L44

вы видите, как они передают account_id

Надеюсь, это поможет. удачи

0 голосов
/ 24 февраля 2020

Эта ошибка также может быть вызвана использованием токена с истекшим сроком действия (используйте конечную точку refre sh, чтобы получить новый)

0 голосов
/ 14 января 2020

Вы должны использовать request_jwt_user_token, а не request_jwt_application_token

См. Пример кода: https://github.com/docusign/eg-01-python-jwt/blob/master/example_base.py#L34

request_jwt_application_token только для некоторых организаций DocuSign API.

Добавлено

Из комментария: я изменил вызов на request_jwt_user_token и получил другой токен, но он все равно не работает. Ответ: {"error": "internal_server_error", "reference_id": "846114d0-1bcd-47a6-ba23-317049b54d00"}

Ответ:

Вы звоните / oauth / метод userinfo API. Но заголовок авторизации не был включен.

Один из способов - установить авторизацию явно:

client.set_default_header("Authorization", "Bearer " + ds_access_token)

В вашем случае SDK должен установить ее для вас. Возможно, вы используете новый объект client, более старую версию SDK или какую-то другую проблему.

Я только что скачал пример кода eg-01- python -jwt репо и все работало нормально. Я предлагаю вам сначала загрузить пример приложения и запустить его, а затем обновить приложение в соответствии с вашими потребностями.

Кроме того, проверьте версию Python SDK, которую вы используете:

pip3 show docusign_esign
Name: docusign-esign
Version: 3.0.0
Summary: DocuSign REST API
...
Location: /usr/local/lib/python3.7/site-packages
...
...