/// <summary>
    /// Validate the token and get informations.
    /// </summary>
    /// <param name="accessToken">Access token.</param>
    /// <returns>TokenInfoResponse or Exception for error</returns>
    static IEnumerator ValidateToken(string accessToken)
    {
        var request = new UnityWebRequest(
            "https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=" + accessToken);

        var response = request.GetResponse();

        while (!response.isDone)
        {
            yield return(null);
        }

        if (response.error != null)
        {
            yield return(response.error);

            yield break;
        }

        JsonReader reader = new JsonReader(response.text);
        var        json   = reader.Deserialize <Dictionary <string, object> >();

        if (json == null)
        {
            yield return(new Exception(-1, "TokenInfo response parsing failed."));

            yield break;
        }

        yield return(new TokenInfoResponse(json));
    }
    /// <summary>
    /// Revoke a access token.
    /// </summary>
    /// <param name="token">Access token.</param>
    /// <returns>RevokeResponse or Exception for error.</returns>
    static IEnumerator RevokeToken(string token)
    {
        var request = new UnityWebRequest(
            "https://accounts.google.com/o/oauth2/revoke?token=" + token);

        var response = request.GetResponse();

        while (!response.isDone)
        {
            yield return(null);
        }

        if (response.error != null)
        {
            yield return(response.error);

            yield break;
        }

        JsonReader reader = new JsonReader(response.text);
        var        json   = reader.Deserialize <Dictionary <string, object> >();

        if (json == null)                       // no response is success.
        {
            yield return(new RevokeResponse()); // error is null.
        }
        else
        {
            yield return(new RevokeResponse(json));
        }
    }
    /// <summary>
    /// Get the access token by the authorization code.
    /// </summary>
    /// <param name="authorizationCode">Authorization code.</param>
    /// <returns>TokenResponse or Exception for error.</returns>
    IEnumerator GetAccessTokenByAuthorizationCode(string authorizationCode)
    {
        var request = new UnityWebRequest("https://accounts.google.com/o/oauth2/token");

        request.method = "POST";
        request.headers["Content-Type"] = "application/x-www-form-urlencoded";
        request.body = Encoding.UTF8.GetBytes(string.Format(
                                                  "code={0}&" +
                                                  "client_id={1}&" +
                                                  "client_secret={2}&" +
                                                  "redirect_uri={3}&" +
                                                  "grant_type=authorization_code",
                                                  authorizationCode, ClientID, ClientSecret, RedirectURI));

        var response = request.GetResponse();

        while (!response.isDone)
        {
            yield return(null);
        }

        if (response.error != null)
        {
            yield return(response.error);

            yield break;
        }

        JsonReader reader = new JsonReader(response.text);
        var        json   = reader.Deserialize <Dictionary <string, object> >();

        if (json == null)
        {
            yield return(new Exception(-1, "GetAccessToken response parsing failed."));

            yield break;
        }

        yield return(new TokenResponse(json));
    }