У меня есть консольное приложение, в котором я использую для тестирования некоторого кода. В моем консольном приложении все работает как положено. Тот же код реализован в формах xamarin, и я получаю сообщение, что я отправил запрос на identity4 для получения токена, и он работает, получая токен длиной 685 символов. Тот же код, который я использую в консоли, реализован в android при нажатии кнопки, и я также получаю токен. Я пытаюсь использовать токен доступа к своему защищенному API, и я получаю Несанкционированный доступ. Я пытаюсь использовать токен в почтальоне и получаю Несанкционированный доступ. Если я использую полученный токен в моей консоли в почтальоне, он работает! Я понимаю, что в консольном приложении токен доступа имеет длину 865 символов, а в android токен доступа имеет длину 864. Я проверил длину полученного содержимого, прежде чем применить NewtonSoft Json converter
Мой код консоли:
private static async Task Main()
{
Console.WriteLine("Request For a token");
//var handler = new HttpClientHandler();
//handler.ClientCertificateOptions = ClientCertificateOption.Manual;
//handler.SslProtocols = SslProtocols.Tls12;
//handler.ClientCertificates.Add(new X509Certificate2("rsaCert.pfx","1234"));
//var client = new HttpClient(handler);
// discover endpoints from metadata
var client = new HttpClient();
//client.BaseAddress = new Uri("http://localhost:5000");
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("grant_type", "password"),
new KeyValuePair<string, string>("username", "test"),
new KeyValuePair<string, string>("password", "test"),
new KeyValuePair<string, string>("scope", "catalogapi1"),
new KeyValuePair<string, string>("client_id", "ro.client"),
new KeyValuePair<string, string>("client_secret", "secret")
});
var result = await client.PostAsync("http://localhost:5000/connect/token", content);
string resultContent = await result.Content.ReadAsStringAsync();
Console.WriteLine(resultContent);
ServerReponse responseToken = JsonConvert.DeserializeObject<ServerReponse>(resultContent);
Console.WriteLine("Token Lenght: "+ responseToken.access_token.Length);
Console.WriteLine("\n\n");
// call api
var apiClient = new HttpClient();
apiClient.SetBearerToken(responseToken.access_token);
var response = await apiClient.GetAsync("http://localhost:5100/api/v1/products");
if (!response.IsSuccessStatusCode)
{
Console.WriteLine(response.StatusCode);
}
else
{
var content2 = await response.Content.ReadAsStringAsync();
Console.WriteLine(JArray.Parse(content2));
}
Console.WriteLine("Press a key to close the application");
Console.ReadLine();
}
И в моем Android действии щелчка по событию:
async void OnButtonClicked(object sender, EventArgs args)
{
var client = new HttpClient();
//client.BaseAddress = new Uri("http://localhost:5000");
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("grant_type", "password"),
new KeyValuePair<string, string>("username", "test"),
new KeyValuePair<string, string>("password", "test"),
new KeyValuePair<string, string>("scope", "test"),
new KeyValuePair<string, string>("client_id", "ro.client"),
new KeyValuePair<string, string>("client_secret", "secret")
});
var result = await client.PostAsync("http://10.0.2.2:5000/connect/token", content);
string resultContent = await result.Content.ReadAsStringAsync();
Console.WriteLine(resultContent);
ServerReponse responseToken = JsonConvert.DeserializeObject<ServerReponse>(resultContent);
// call api
var apiClient = new HttpClient();
apiClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", responseToken.access_token.Trim());
// apiClient.SetBearerToken(responseToken.access_token);
var response = await apiClient.GetAsync("http://10.0.2.2:5100/api/v1/products");
if (!response.IsSuccessStatusCode)
{
Console.WriteLine(response.StatusCode);
}
else
{
var content2 = await response.Content.ReadAsStringAsync();
Console.WriteLine(JArray.Parse(content2));
}
Console.WriteLine("Press a key to close the application");
Console.ReadLine();
}
public class ServerReponse
{
public string access_token { get; set; }
public string expires_in { get; set; }
public string token_type { get; set; }
public string scope { get; set; }
}