Je code en C # pour Xamarin Forms et j'utilise JWTAuth pour authentifier un nom d'utilisateur et un mot de passe sur Wordpress.

Cependant, je reçois deux réponses JSON qui ne semblent pas remplir les variables.

Réponse JSON 1:

{"success":false,"statusCode":403,"code":"invalid_username","message":"Unknown username. Check again or try your email address.","data":[]}

Réponse JSON 2:

{"success":true,"statusCode":200,"code":"jwt_auth_valid_credential","message":"Credential is valid","data":{"token":"xxxxx","id":xxxx,"email":"xxxxx","nicename":"xxxx","firstName":"xxxx","lastName":"xxxx","displayName":"xxxx"}}

Vous remarquerez que la deuxième réponse, si l'utilisateur est validé, remplit des détails supplémentaires dans les valeurs de clé de données.

J'ai essayé de désérialiser ces deux réponses en une seule classe mais cela ne semble pas remplir les variables si un utilisateur a été validé avec succès, ce qui est étrange.

Voici mon code:

Console.WriteLine("Running Authentication...");

string JWTAPI = "https://xxxx/wp-json/jwt-auth/v1/token";

var client = new HttpClient();
var uri = JWTAPI;

var jsonContent = "{ \"username\": \"" + EntryLoginUsername + "\", \"password\": \"" + EntryLoginPassword + "\"}";

StringContent content = new StringContent(jsonContent, Encoding.UTF8, "application/json");

var response_status = await client.PostAsync(uri, content);

var response_result = await response_status.Content.ReadAsStringAsync();

JWTJSONResponse = response_result;

Console.WriteLine(JWTJSONResponse);

Root JWTResults = JsonConvert.DeserializeObject<Root>(JWTJSONResponse);

Console.WriteLine("Result: " + JWTResults.success);

            if (JWTResults.success.ToString() == "True")    
            {
                ResultTextHeader.Text = "LOGIN SUCCESSFUL!";
                Console.WriteLine("Status Code: " + JWTResults.statusCode);
                Console.WriteLine("Code: " + JWTResults.code);
                Console.WriteLine("Message: " + JWTResults.message);
            }
            else
            {
                ResultTextHeader.Text = "Unsuccessful login. Please try again.";
            }

Et mes cours:

public class Data
        {
            public string token { get; set; }
            public int id { get; set; }
            public string email { get; set; }
            public string nicename { get; set; }
            public string firstName { get; set; }
            public string lastName { get; set; }
            public string displayName { get; set; }
        }

        public class Root
        {
            // JWT
            public bool success { get; set; }
            public int statusCode { get; set; }
            public string code { get; set; }
            public string message { get; set; }
            public List<object> data { get; set; }

        }
0
Khoa 3 sept. 2020 à 09:13

2 réponses

Meilleure réponse

C'est parce que dans JSON Response 1, data est un tableau vide. Dans JSON Response 2, data est un objet non vide.

Votre classe Root a une propriété data qui est de type List<object>. Cela ne peut traiter qu'un tableau. Pour que cela fonctionne, remplacez Root.data par le type Data comme dans:

public class Root
{
    // JWT
    public bool success { get; set; }
    public int statusCode { get; set; }
    public string code { get; set; }
    public string message { get; set; }
    public Data data { get; set; }
}

De plus, si vous y avez accès, remplacez la réponse JSON 1 par { <omitted code>, data: null } au lieu de { <omitted code>, data: [] }. Cela n'a pas beaucoup de sens que ce soit un tableau dans le cas "sans données" et un objet dans le cas "avec données".

1
Christian 3 sept. 2020 à 07:00

En supposant que votre appel de repos pour valider les informations d'identification de l'utilisateur enverra 403 lorsque l'utilisateur n'est pas autorisé. Je pense que vous ne définissez pas correctement l'objet de classe pour la désérialisation. Essayez ci-dessous où j'ai défini la classe Data dans la classe Root

Tout d'abord, vous avez besoin d'une classe pour désérialiser les données et ne semble pas correcte,

   public class Data
    {
        public string token { get; set; }
        public int id { get; set; }
        public string email { get; set; }
        public string nicename { get; set; }
        public string firstName { get; set; }
        public string lastName { get; set; }
        public string displayName { get; set; }
    }

    public class Root
    {
        // JWT
        public bool success { get; set; }
        public int statusCode { get; set; }
        public string code { get; set; }
        public string message { get; set; }
        public Data data { get; set; }
    }

Root JWTResults = JsonConvert.DeserializeObject<Root>(JWTJSONResponse);

Vérifier également une réponse comme celle-ci n'est pas valide,

if (JWTResults.success.ToString() == "True")   

Au lieu de cela, vous devez toujours vérifier le code de réponse de l'API (200/403/401) Tu devrais faire entrer ça,

    var response_status = await client.PostAsync(uri, content)
    if (response_status.StatusCode != HttpStatusCode.OK)
    {
       //Return error ??
    }
1
Sohan 3 sept. 2020 à 07:15