Токен доступа Identitty4 от Android и длина токена - PullRequest
0 голосов
/ 06 мая 2020

У меня есть консольное приложение, в котором я использую для тестирования некоторого кода. В моем консольном приложении все работает как положено. Тот же код реализован в формах 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; }

    }
...