J'ai une API WEB fonctionnelle que j'ai écrite et j'ai ajouté une authentification de base à l'API (le nom d'utilisateur est "testing", le mot de passe est "123456"). Cependant, lorsque j'essaie d'appeler cette API à partir de mon formulaire Web, je reçois toujours le message "(401) Non autorisé". Que dois-je changer dans le code Web pour appeler l'API avec succès?
string url = String.Format("http://example.com"); //here I have the correct url for my API
HttpWebRequest requestObj = (HttpWebRequest)WebRequest.Create(url);
requestObj.Method = "Get";
requestObj.PreAuthenticate = true;
requestObj.Credentials = new NetworkCredential("testing", "123456");
HttpWebResponse responseObj = null;
responseObj = (HttpWebResponse)requestObj.GetResponse();
string strresult = null;
using (Stream stream = responseObj.GetResponseStream())
{
StreamReader sr = new StreamReader(stream);
strresult = sr.ReadToEnd();
sr.Close();
}
C'est ce que mon API recherche en termes d'authentification:
actionContext.Request.Headers.Authorization.Parameter
Dois-je ajouter un en-tête au lieu de NetworkCredential ou est-ce la même chose?
(Authentification de base) Voici l'autre solution pour appeler l'API authentifiée
class Program
{
static void Main(string[] args)
{
BaseClient clientbase = new BaseClient("https://website.com/api/v2/", "username", "password");
BaseResponse response = new BaseResponse();
BaseResponse response = clientbase.GetCallV2Async("Candidate").Result;
}
public async Task<BaseResponse> GetCallAsync(string endpoint)
{
try
{
HttpResponseMessage response = await client.GetAsync(endpoint + "/").ConfigureAwait(false);
if (response.IsSuccessStatusCode)
{
baseresponse.ResponseMessage = await response.Content.ReadAsStringAsync();
baseresponse.StatusCode = (int)response.StatusCode;
}
else
{
baseresponse.ResponseMessage = await response.Content.ReadAsStringAsync();
baseresponse.StatusCode = (int)response.StatusCode;
}
return baseresponse;
}
catch (Exception ex)
{
baseresponse.StatusCode = 0;
baseresponse.ResponseMessage = (ex.Message ?? ex.InnerException.ToString());
}
return baseresponse;
}
}
public class BaseResponse
{
public int StatusCode { get; set; }
public string ResponseMessage { get; set; }
}
public class BaseClient
{
readonly HttpClient client;
readonly BaseResponse baseresponse;
public BaseClient(string baseAddress, string username, string password)
{
HttpClientHandler handler = new HttpClientHandler()
{
Proxy = new WebProxy("http://127.0.0.1:8888"),
UseProxy = false,
};
client = new HttpClient(handler);
client.BaseAddress = new Uri(baseAddress);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var byteArray = Encoding.ASCII.GetBytes(username + ":" + password);
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
baseresponse = new BaseResponse();
}
}
Je pense que votre API peut nécessiter l'ajout d'un en-tête (si vous ne l'avez pas déjà fait). Jetez un œil à cet article: https://en.wikipedia.org/wiki/Basic_access_authentication#Client_side
Mais essentiellement, votre API aura besoin d'un en-tête Authorization
ajouté. La clé Authorization
contiendra le mot Basic
suivi d'un espace, puis le nom d'utilisateur et le mot de passe chiffrés à l'aide de Base64
. Donc, dans votre cas, testing:123456
serait crypté en utilisant base64 comme dGVzdGluZzoxMjM0NTY=
. Ainsi, l'enregistrement d'en-tête ressemblera à ceci:
Authorization: Basic dGVzdGluZzoxMjM0NTY=