Базовая авторизация клиента REST для API REST
У меня вопрос. У меня есть значение Basic Authorization, которое Base64Encoded и выглядит примерно так: "aHZjYnN4NXJ4bXV6OmplWHN1Wl....", мне просто интересно, где я могу поместить это значение в код? Это необходимо, чтобы я мог получить токен доступа на предъявителя. Я заставляю его работать в Почтальоне, но не в этом коде. Этот код работает для получения строк JSON из других API, которые не требуют дополнительной авторизации. Но когда я пробую его на другом API, который требует строку Basic Authorization, я получаю эту ошибку: {"errorMessage":["Удаленный сервер возвратил ошибку: (405) Метод не разрешен."],"Errors":{}}. Не могу найти много документации по этому вопросу, любая помощь будет высоко ценится.
Вот код в классе формы:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AuthtRestClient
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
#region UI Event Handlers
private void CmdGO_Click(object sender, EventArgs e)
{
RestClient rClient = new RestClient();
rClient.Endpoint = txtRequestURI.Text;
rClient.UserName = txtUserName.Text;
rClient.UserPassword = txtPassword.Text;
DebugOutput("REst Client Created");
string strResponse = string.Empty;
strResponse = rClient.MakeRequest();
DebugOutput(strResponse);
}
#endregion
private void DebugOutput (string strDebugText)
{
try
{
System.Diagnostics.Debug.Write(strDebugText + Environment.NewLine);
txtResponse.Text = txtResponse.Text + strDebugText + Environment.NewLine;
txtResponse.SelectionStart = txtResponse.TextLength;
txtResponse.ScrollToCaret();
}
catch (Exception ex)
{
System.Diagnostics.Debug.Write(ex.Message, ToString() + Environment.NewLine);
}
}
}
}
Вот код в классе RestClient:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.IO;
namespace AuthtRestClient
{
public enum HttpVerb
{
GET,
POST,
PUT,
DELETE
}
public enum AuthenticationType
{
Basic,
NTLM
}
public enum AuthenticationTechnique
{
RollYourOwn,
NetworkCredential
}
class RestClient
{
public string Endpoint { get; set; }
public string EndPoint { get; }
public HttpVerb HttpMethod { get; set; }
public AuthenticationType AuthType { get; set; }
public AuthenticationTechnique AuthTech { get; set; }
public string UserName { get; set; }
public string UserPassword { get; set; }
public RestClient()
{
EndPoint = string.Empty;
HttpMethod = HttpVerb.GET;
}
public string MakeRequest()
{
string strResponseValue = string.Empty;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Endpoint);
request.Method = HttpMethod.ToString();
string authHeader = System.Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(UserName + ":" + UserPassword));
request.Headers.Add("Authorization", "Basic " + authHeader);
HttpWebResponse response = null;
try
{
response = (HttpWebResponse)request.GetResponse();
// Process the response stream... (could be JSON, XML, HTML, etc...)
using (Stream responseStream = response.GetResponseStream())
{
if (responseStream != null)
{
using (StreamReader reader = new StreamReader(responseStream))
{
strResponseValue = reader.ReadToEnd();
}// End of StreamReader
}
}// End of using ResponseStream
}
catch(Exception ex)
{
strResponseValue = "{\"errorMessage\":[\"" + ex.Message.ToString() + "\"],\"errors\":{}}";
}
finally
{
if (response != null)
{
((IDisposable)response).Dispose();
}
}
return strResponseValue;
}
}
}
Я попытался пропустить его несколькими различными способами, один из которых выглядит следующим образом, но не смог заставить его работать:
string authHeader = System.Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("U4OXU5aHZjYnN4NXJ4bXV6ORIWUp==" +
":" +UserName + ":" + UserPassword));
request.Headers.Add("Authorization", "Basic " + authHeader);
Любая помощь приветствуется. Спасибо.
1 ответ
Я понял это с помощью RestSharp.
// RestSharp code:
var client = new RestClient("https://auth.example.com/oauthserver/oauth2/token/");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
//request.AddHeader("Postman-Token", "1defca09-ab68-43cd-91a0-a78709a2fb41"); //this line not needed
request.AddHeader("Cache-Control", "no-cache");
request.AddHeader("Authorization", "Basic U5aHZjYnN4NXJlWHN1WlhwZDZIbn==");
request.AddParameter("undefined", "grant_type=client_credentials", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
var content = response.Content; // raw content as string