Реальная учетная запись интеграции служб DocuSign не может пройти проверку подлинности - PullRequest
0 голосов
/ 11 мая 2018

Я создал интеграцию DocuSign, которая отлично работает с учетной записью песочницы, но у меня проблемы с реальной учетной записью.Я использую C # SDK .Я использую код авторизации с олицетворением.Отладка показывает, что объект LoginInformation создан, но его свойство LoginAccounts имеет значение null, что, конечно, нарушает код, пытающийся получить соответствующий базовый URL-адрес для последующих вызовов API.Есть предложения?

public static ApiClient GetDocuSignClient()
{
    string accountType = SettingsKeyInfoProvider.GetValue(SiteContext.CurrentSiteName + ".DocuSignAccountType");
    string integratorKey = SettingsKeyInfoProvider.GetValue(SiteContext.CurrentSiteName + ".DocuSignIntegratorKey");
    string userID = SettingsKeyInfoProvider.GetValue(SiteContext.CurrentSiteName + ".DocuSignUserID");
    string rsaPrivate = SettingsKeyInfoProvider.GetValue(SiteContext.CurrentSiteName + ".DocuSignRSAKey");
    string basePath = accountType == "sandbox" ? "account-d.docusign.com" : "account.docusign.com";
    // this gets replaced when we communicate with the api
    string clientBasePath = accountType == "sandbox" ? "https://demo.docusign.net/restapi" : "https://www.docusign.net/restapi";
    int expirationHours = 1;

    if (accountType == "" || integratorKey == "" || userID == "" || rsaPrivate == "")
        throw new System.Configuration.ConfigurationErrorsException("All DocuSign settings must be set in Settings->Integration->DocuSign");

    ApiClient dsClient = new ApiClient(clientBasePath);
    dsClient.ConfigureJwtAuthorizationFlow(integratorKey, userID, basePath, HttpContext.Current.Server.MapPath(rsaPrivate), expirationHours);


    AuthenticationApi authClient = new AuthenticationApi(dsClient.Configuration);
    LoginInformation loginInfo = authClient.Login();

    // find the default account for this user
    foreach (LoginAccount loginAcct in loginInfo.LoginAccounts)
    {
      ...

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Я нашел ошибки или очень вводящие в заблуждение утверждения в документации к DocuSign API.Кажется, что вызов oauth / userinfo возвращает базовый URL-адрес для учетной записи в разных форматах для песочницы и реальных учетных записей.Следующий код немного грязный, но он работает для обоих.

public static ApiClient GetDocuSignClient()
{
    string accountType = SettingsKeyInfoProvider.GetValue(SiteContext.CurrentSiteName + ".DocuSignAccountType");
    string integratorKey = SettingsKeyInfoProvider.GetValue(SiteContext.CurrentSiteName + ".DocuSignIntegratorKey");
    string userID = SettingsKeyInfoProvider.GetValue(SiteContext.CurrentSiteName + ".DocuSignUserID");
    string rsaPrivate = SettingsKeyInfoProvider.GetValue(SiteContext.CurrentSiteName + ".DocuSignRSAKey");
    string basePath = accountType == "sandbox" ? "account-d.docusign.com" : "account.docusign.com";
    // this gets replaced when we communicate with the api
    string clientBasePath = accountType == "sandbox" ? "https://demo.docusign.net/restapi" : "https://www.docusign.net/restapi";
    int expirationHours = 1;

    if (accountType == "" || integratorKey == "" || userID == "" || rsaPrivate == "")
        throw new System.Configuration.ConfigurationErrorsException("All DocuSign settings must be set in Settings->Integration->DocuSign");

    ApiClient dsClient = new ApiClient(clientBasePath);
    dsClient.ConfigureJwtAuthorizationFlow(integratorKey, userID, basePath, HttpContext.Current.Server.MapPath(rsaPrivate), expirationHours);

    var rsUserClient = new RestSharp.RestClient("https://" + basePath); ;
    RestSharp.RestRequest acctReq = new RestSharp.RestRequest();
    acctReq.Method = RestSharp.Method.GET;
    acctReq.RequestFormat = RestSharp.DataFormat.Json;
    acctReq.Resource = "oauth/userinfo";

    // even though we're not using the SDK to get accounts, we can use the token it generates
    AuthenticationApi authClient = new AuthenticationApi(dsClient.Configuration);
    acctReq.AddHeader("Authorization", authClient.Configuration.DefaultHeader["Authorization"]);


    RestSharp.IRestResponse rsResponse = rsUserClient.Execute(acctReq);
    if (rsResponse.ResponseStatus != RestSharp.ResponseStatus.Completed || rsResponse.StatusCode != HttpStatusCode.OK)
    {
        if (rsResponse.ErrorException != null)
            throw new WebException("DocuSign login failed: " + rsResponse.ErrorException.Message, rsResponse.ErrorException);
        else if (rsResponse.StatusCode == HttpStatusCode.BadRequest)
            throw new WebException(String.Format("DocuSign login failed. StatusCode: {0} <br/>ErrorDescription: {1}", rsResponse.StatusCode, rsResponse.Content));
        else
            throw new WebException(String.Format("DocuSign login failed. StatusCode: {0} ResponseStatus: {1}", rsResponse.StatusCode, rsResponse.ResponseStatus));
    }

    DocuSignLoginInfo loginInfo = JsonConvert.DeserializeObject<DocuSignLoginInfo>(rsResponse.Content);
    DocuSignLoginAccount toUse = null;
    foreach (var loginAcct in loginInfo.Accounts)
    {
        if (toUse == null)
        {
            toUse = loginAcct; // use first account
        }
        else if (loginAcct.IsDefault && 
            ((accountType == "sandbox" && loginAcct.Base_Uri.Contains("demo.")) || 
            (accountType != "sandbox" && !loginAcct.Base_Uri.Contains("demo."))))
        {
            toUse = loginAcct; // use default account if appropriate
        }

    }

    if (toUse == null)
    {
        throw new WebException("DocuSign login failed: " + loginInfo.Email + " doesn't have a login account we can use.");
    }
    else
    {
        SettingsKeyInfoProvider.SetValue("DocuSignAccountID", SiteContext.CurrentSiteName, toUse.Account_Id);

        string[] separatingStrings = { "/v2" };

        string restUrl = toUse.Base_Uri.Split(separatingStrings, StringSplitOptions.RemoveEmptyEntries)[0];
        if (!restUrl.Contains("/restapi"))
            restUrl += "/restapi";

        // Update ApiClient with the new base url from login call
        dsClient = new ApiClient(restUrl);
    }


    return dsClient;
}

public class DocuSignLoginAccount
{
    public string Account_Id;
    public string Account_Name;
    public bool IsDefault;
    public string Base_Uri;
}

public class EnvelopeBrief
{
    public string EnvID;
    public Signer CurrentSigner;
    public string ClientUserID;
}
0 голосов
/ 11 мая 2018

В соответствии с нашими DS Docs также, с OAUTH (и JWT), вы не должны использовать Login_information API, вместо этого вам нужно использовать User Info API Call для получения базового URI.Как только вы получите базовый URI, вы все остальные API, не связанные с аутентификацией, используете этот базовый URI.Демонстрационная среда находится только в одном центре обработки данных, поэтому с вашим текущим кодом она отлично работает в Sandbox, но у PROD есть несколько центров обработки данных, таких как NA1, NA2, NA3, EU1, и ваша учетная запись может находиться в любом из них, так чтоточный URI, который нужно использовать для попадания в центр обработки данных при создании конвертов, вам нужно использовать User Info вызов API, чтобы узнать базовый URI.

В настоящее время в вашем коде вы жестко закодировали BaseUri(или Базовый путь клиента) clientBasePath = https://www.docusign.net/restapi, в этом жестком кодировании вы предполагаете, что ваша учетная запись PROD находится в NA1, но, как я упоминал ранее, она может быть и в любых других центрах обработки данных, поэтому, пожалуйста, измените код для вызова userinfo / API call,Наш SDK имеет этот код (неправильно вызывающий LoginInformation вместо userinfo /), который был написан неправильно, и я уже сообщил об этом команде центра разработки DS, чтобы исправить этот поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...