Значения пустых полей при преобразовании строки JSON (без нулевых значений) в класс Google OAuth API TokenResponse - PullRequest
2 голосов
/ 06 июля 2019

Моя строка JSON

{
  "AccessToken":"myAccessToken",
  "TokenType":"Bearer",
  "ExpiresInSeconds":"3600",
  "RefreshToken":"myRefreshToken",
  "Scope":"myScopes",
  "Issued":"05/07/2019 16:51:53",
  "IssuedUtc":"05/07/2019 14:51:53"
}

Класс объекта, который я использую (API Google TokenResponse класс)

public class TokenResponse
{
    public string AccessToken { get; set; }
    public string TokenType { get; set; }
    public long? ExpiresInSeconds { get; set; }
    public string RefreshToken { get; set; }
    public string Scope { get; set; }
    public string IdToken { get; set; }
    public DateTime Issued { get; set; }
    public DateTime IssuedUtc { get; set; }
}

Я использую Json.NET для преобразования строки JSON в объект, подобный этому

string jsonToken = await System.IO.File.ReadAllTextAsync(pathJsonToken);
TokenResponse token = JsonConvert.DeserializeObject<TokenResponse>(jsonToken);       

jsonToken значение - это строка JSON, которую я написал выше, при преобразовании в TokenResponse заполняются только поля Issued, IssuedUtc и Scope.

Сначала я подумал, что ошибка вызвана отсутствующим полем IdToken, но я попытался использовать определенный мной класс, который идентичен TokenResponse от Google, и он передает все значения (кроме * 1020) * очевидно).

Я пытаюсь использовать уже существующий класс, но я не могу заставить его работать.

Чего мне не хватает?

1 Ответ

1 голос
/ 06 июля 2019

Класс TokenResponse, который вы указали в своем вопросе, прекрасно работает с указанным вами JSON.(Демонстрация здесь )

Теперь взгляните на исходный код для версии Google того же класса.Вот урезанная версия:

public class TokenResponse
{
    [Newtonsoft.Json.JsonPropertyAttribute("access_token")]
    public string AccessToken { get; set; }

    [Newtonsoft.Json.JsonPropertyAttribute("token_type")]
    public string TokenType { get; set; }

    [Newtonsoft.Json.JsonPropertyAttribute("expires_in")]
    public Nullable<long> ExpiresInSeconds { get; set; }

    [Newtonsoft.Json.JsonPropertyAttribute("refresh_token")]
    public string RefreshToken { get; set; }

    [Newtonsoft.Json.JsonPropertyAttribute("scope")]
    public string Scope { get; set; }

    [Newtonsoft.Json.JsonPropertyAttribute("id_token")]
    public string IdToken { get; set; }

    [Obsolete("Use IssuedUtc instead")]
    [Newtonsoft.Json.JsonPropertyAttribute(Order = 1)] 
    public DateTime Issued
    {
        get { return IssuedUtc.ToLocalTime(); }
        set { IssuedUtc = value.ToUniversalTime(); }
    }

    [Newtonsoft.Json.JsonPropertyAttribute(Order = 2)]
    public DateTime IssuedUtc { get; set; }

    ...
}

Теперь должно быть понятно, в чем проблема: их класс ожидает имена свойств JSON, отличные от того, что вы используете.JSON должен выглядеть следующим образом:

{
  "access_token": "myAccessToken",
  "token_type": "Bearer",
  "expires_in": "3600",
  "refresh_token": "myRefreshToken",
  "scope": "myScopes",
  "Issued": "05/07/2019 16:51:53",
  "IssuedUtc": "05/07/2019 14:51:53"
}

Этот формат ответа хорошо документирован в разделе 5.1 спецификации OAuth 2.0 (RFC 6749).Но обратите внимание, что только первые пять свойств определяются спецификацией;Issued и IssuedUtc являются дополнительными свойствами, добавленными Google (первый из которых помечен как устаревший в коде).

Вот рабочая демонстрация с использованием правильного JSON с классом Google TokenResponse: https://dotnetfiddle.net/2wXojV

...