Valentine 0 Опубликовано: 25 августа 2015 Share Опубликовано: 25 августа 2015 Здравствуйте. Можете помочь со следующей проблемой? Не удаётся подключиться к API из приложения на C#. Постоянно выдаёт ошибку "Удаленный сервер возвратил ошибку: (401) Несанкционированный." Чувствую, что где-то ошибся, но пока не могу понять, где именно. Формирование запроса string addr = @"https://api.zadarma.com/v1/info/balance/"; 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; } Ссылка на сообщение
sunscrit 0 Опубликовано: 27 августа 2015 Share Опубликовано: 27 августа 2015 Здравствуйте, 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) Ссылка на сообщение
sanek911 0 Опубликовано: 21 марта 2017 Share Опубликовано: 21 марта 2017 Здравствуйте! я использую этот пример как базу для подключиться к API из приложения на C#, если я использую метод без параметров, то все работает отлично, но если я использую метод с параметрами, то у меня ошибка авторизации. Подскажи что не так. public static string ByteToString(byte[] buff) { var sbinary = ""; for (var i = 0; i < buff.Length; i++) { sbinary += buff.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 - этот параметр Ссылка на сообщение
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВойти
Уже зарегистрированы? Войдите здесь.
Войти сейчас