Как создать токен обновления и доступа для приложения Windows Phone - PullRequest
0 голосов
/ 25 октября 2018

У меня есть приложение для Windows Phone 8, и я пытаюсь выполнить Google Auth.Я попадаю на страницу входа и после входа перехожу на страницу согласия.После нажатия кнопки Разрешить доступ я не получаю токен доступа и не обновляю токен в ответ.

Ответ, который я получаю, выглядит следующим образом:

{
"error" : "invalid_request",
"error_description" : "Missing header: Content-Type"
}

Код состояния Неверный запрос .

Вот мой код:

private void webBrowserGooglePlusLogin_Navigating(object sender, NavigatingEventArgs e)
    {

        if (e.Uri.Host.Equals("localhost"))
        {
            webBrowserGooglePlusLogin.Visibility = Visibility.Collapsed;
            e.Cancel = true;
            int pos = e.Uri.Query.IndexOf("=");              
            code = pos > -1 ? e.Uri.Query.Substring(pos + 1) : null;
        }
        if (string.IsNullOrEmpty(code))
        {
           // OnAuthenticationFailed();
        }
        else
        {
            var request = new RestRequest(this.TokenEndPoint, Method.POST);
            request.AddParameter("code", code);
            request.AddParameter("client_id", this.ClientId);
            request.AddParameter("client_secret", this.Secret);
            request.AddParameter("redirect_uri", "http://localhost");
            request.AddParameter("grant_type", "authorization_code");
            //request.AddHeader("Content-type", "json");

            client.ExecuteAsync<AuthResult>(request, GetAccessToken);
        }
    }

    void GetAccessToken(IRestResponse<AuthResult> response)
    {
        if (response == null || response.StatusCode != HttpStatusCode.OK
            || response.Data == null || string.IsNullOrEmpty(response.Data.access_token))
        {
           // OnAuthenticationFailed();
        }
        else
        {               
        }
    }

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 25 октября 2018

Тип контента должен быть установлен

request.ContentType = "application/x-www-form-urlencoded";

Это мой пример .net, не уверен, что все это работает на Windows-Phone, но это может помочь

 class TokenResponse
    {
        public string access_token { get; set; }
        public string token_type { get; set; }
        public string expires_in { get; set; }
        public string refresh_token { get; set; }
    }

/// <summary>

        /// exchanges the authetncation code for the refreshtoken and access token
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public static string exchangeCode(string code)
        {


            string url = "https://accounts.google.com/o/oauth2/token";
            string postData = string.Format("code={0}&client_id={1}&client_secret={2}&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code", code, Properties.Resources.clientId, Properties.Resources.secret);


            // Create a request using a URL that can receive a post. 
            WebRequest request = WebRequest.Create(url);
            // Set the Method property of the request to POST.

            request.Method = "POST";

            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            // Set the ContentType property of the WebRequest.
            request.ContentType = "application/x-www-form-urlencoded";
            // Set the ContentLength property of the WebRequest.
            request.ContentLength = byteArray.Length;
            // Get the request stream.
            Stream dataStream = request.GetRequestStream();
            // Write the data to the request stream.
            dataStream.Write(byteArray, 0, byteArray.Length);
            // Close the Stream object.
            dataStream.Close();
            // Get the response.
            WebResponse response = request.GetResponse();
            // Display the status.
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            // Get the stream containing content returned by the server.
            dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader(dataStream);
            // Read the content.
            string responseFromServer = reader.ReadToEnd();

            TokenResponse tmp = JsonConvert.DeserializeObject<TokenResponse>(responseFromServer);

            // Display the content.
            Console.WriteLine(responseFromServer);
            // Clean up the streams.
            reader.Close();
            dataStream.Close();
            response.Close();
            return tmp.refresh_token;
        }

Простой

...