Перейти к содержимому


Фотография

Доступ К Api Из .net

C# .net

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 2

#1 Valentine

Valentine

    Новичок

  • Пользователи
  • 1 сообщений

Отправлено 26 Август 2015 - 00:36

Здравствуйте. Можете помочь со следующей проблемой?

 

Не удаётся подключиться к API из приложения на C#. Постоянно выдаёт ошибку "Удаленный сервер возвратил ошибку: (401) Несанкционированный."

Чувствую, что где-то ошибся, но пока не могу понять, где именно.

 

Формирование запроса

 

 

                        
string methodName = @"/v1/info/balance/";
string queryStr = @"";
var plainTextBytes = System.Text.Encoding.Default.GetBytes( SHA1Hash(methodName + queryStr + MD5Hash(queryStr)) );
string fullQueryStr = System.Convert.ToBase64String(plainTextBytes);
                        
HttpWebRequest req = (HttpWebRequest) WebRequest.Create(addr);
req.Method = "GET";
 
req.Headers.Add("Authorization: " + "myUserKey" + ":" + fullQueryStr);
WebResponse resp = req.GetResponse();
 
 
Методы хэширования
public static string SHA1Hash(string instr)
        {
 
            using (SHA1Managed sha1 = new SHA1Managed())
            {
                var hash = sha1.ComputeHash(Encoding.Default.GetBytes(instr + "myPrivKey"));
                var sb = new StringBuilder(hash.Length * 2);
 
                foreach (byte b in hash)
                {
                    sb.Append(b.ToString("X2"));
                }
                return (sb.ToString() );
            }
        }

 

public static string MD5Hash(string instr)
        {
            string strHash = string.Empty;
 
            foreach (byte b in new System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(Encoding.Default.GetBytes(instr)))
            {
                strHash += b.ToString("X2");
            }
            return strHash;
        }


#2 sunscrit

sunscrit

    Новичок

  • Пользователи
  • 1 сообщений
  • Пол:Мужчина

Отправлено 27 Август 2015 - 11:15

Здравствуйте, Valentine

 

У Вас неправильно формируется цифровая подпись

 

1. Вынесите ключи в отдельные константы класса:

private const string key = @"...";
private const string secret = @"...";

2. Используйте следующие функции для шифрования:

public static string SHA1Hash(string instr)
{
    var keyByte = Encoding.Default.GetBytes(secret);

    var hmacsha = new HMACSHA1(keyByte);
    
    hmacsha.ComputeHash(Encoding.Default.GetBytes(instr));

    return ByteToString( hmacsha.Hash ).ToLower();
}

public static string MD5Hash(string instr)
{
    var md5  = new System.Security.Cryptography.MD5CryptoServiceProvider();
    
    var hash = md5.ComputeHash(Encoding.Default.GetBytes(instr));

    return ByteToString(hash).ToLower();
}

public static string ByteToString(byte[] buff)
{
    string sbinary = "";
    for (int i = 0; i < buff.Length; i++) {
        sbinary += buff[i].ToString("X2");
    }
    return sbinary;
}

3. Для отправки цифровой подписи:

req.Headers.Add("Authorization: " + key + ":" + fullQueryStr)


#3 sanek911

sanek911

    Новичок

  • Пользователи
  • 1 сообщений

Отправлено 21 Март 2017 - 17:04

Здравствуйте! я использую этот пример как базу для подключиться к API из приложения на C#, если я использую метод без параметров, то все работает отлично, но если я использую метод с параметрами, то у меня ошибка авторизации. Подскажи что не так.

public static string ByteToString(byte[] buff)

        {
            var sbinary = "";
            for (var i = 0; i < buff.Length; i++)
            {
                sbinary += buff[i].ToString("X2");
            }
            return sbinary;
        }
 
        public static string MD5Hash(string instr)
        {
            byte[] hash;
            using (var md5 = new MD5CryptoServiceProvider())
            {
                hash = md5.ComputeHash(Encoding.Default.GetBytes(instr));
            }
            return ByteToString(hash).ToLower();
        }
 
        public static string SHA1Hash(string instr)
        {
            var result = string.Empty;
            var keyByte = Encoding.Default.GetBytes(Secret);
            using (var hmacsha = new HMACSHA1(keyByte))
            {
                hmacsha.ComputeHash(Encoding.Default.GetBytes(instr));
                result = ByteToString(hmacsha.Hash).ToLower();
            }
            return result;
        }

        public void MakeRequest(string query, string paramStr, string methodType)
        {
            WebResponse response;
            var plainTextBytes = Encoding.Default.GetBytes(SHA1Hash(query + paramStr + MD5Hash(paramStr)));
            var fullQueryStr = Convert.ToBase64String(plainTextBytes);
            var req = (HttpWebRequest)WebRequest.Create(Address + query);
            req.Method = methodType;
            req.Headers.Add("Authorization: " + Key + ":" + fullQueryStr);
            try
            {
                response = req.GetResponse();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw;
            }
            var stream2 = response.GetResponseStream();
            var reader = new StreamReader(stream2);
            var data = reader.ReadToEnd();
            reader.Close();
            stream2.Close();
        }

        public static void Main()
        {
            var queryStr = "number=38097*******&message=\"Test message\"&caller_id=7*****";
            MakeRequest(SendSMS, queryStr, MethodType.POST.ToString());
            MakeRequest(Sip, string.Empty, MethodType.GET.ToString());
            MakeRequest(Balance, string.Empty, MethodType.GET.ToString());
        }
 
где получить caller_id - этот параметр





Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей