2017-10-05 2 views
0

Je crée une application C# qui effectue un appel REST et utilise l'authentification OAuth2.0.Types de retour pour les méthodes OAuth2.0 (C#)

Pour OAuth2.0, le processus consiste à obtenir un jeton par POST, en fournissant client_id, client_secret et grant_type.

Lors d'un appel GET par la suite, le jeton renvoyé par le POST doit être fourni dans le champ d'en-tête.

Donc, cela soulève des questions 2:

  1. Dans la méthode POST pour obtenir le jeton, un JSON est retourné qui contient plusieurs attributs (y compris le jeton et délai d'attente). Comme c'est le jeton requis, JsonConvert (var token = JsonConvert.DeserializeObject> (responseJson) ["access_token"]. ToString();) est utilisé pour simplement amener ceci et mapper la variable à une chaîne. Et la méthode renvoie cette variable sous forme de chaîne. Pour demander un jeton, utilise une chaîne comme type de retour pour la fonction une approche correcte?
  2. Dans la méthode GET pour obtenir les données de l'appel de service REST, le jeton est transmis avec un critère de recherche, ce qui renvoie un résultat Json. JsonConvert.DeserializeObject <> est utilisé pour mapper cela aux objets .NET. Quel devrait être le retour pour cette fonction? Ce n'est pas une chaîne car elle contient plusieurs variables.

Répondre

1

Je vous suggère de créer 2 classes. Un pour votre jeton et un pour la réponse de votre appel.

Le jeton réel n'est pas le seul bit important dans votre appel initial, son type et lorsque le jeton expire, vous sont également importants afin de savoir quel type d'en-tête d'autorisation pour créer (le plus probable Bearer) et aussi quand demander un nouveau jeton ou rafraîchir celui en usage. Donc, utilisez d'abord un client comme Postman pour voir les réponses afin que vous puissiez les refléter dans votre classe C#.

Une fois que vous avez la classe de jetons, passez à la classe suivante.

Vous pourriez bien sûr faire quelque chose d'autre, profiter de « dynamique » par exemple

votre appel pourrait ressembler à ceci:

JsonConvert.DeserializeObject<dynamic>(responseString); 

De cette façon, vous ne devez pas créer des classes pour vos types de retour, mais je recommanderais quand même l'inverse.

Pour votre deuxième question, le type de retour sera celui que vous aurez spécifié au désérialiseur.

Prenons le jeton par exemple:

public sealed class TokenModel 
    { 
     public string access_token { get; set; } 

     public string token_type { get; set; } 

     public int expires_in { get; set; } 
    } 

alors votre appel pour obtenir ces données ressemble à ceci:

var tokenModel = JsonConvert.DeserializeObject<TokenModel>(responseJson); 
+0

Merci Andrei! Si je retourne tout autre attribut dans la méthode de jeton, quelle sera la valeur de retour? Je peux le définir comme «chaîne statique publique RequestToken()», c'est pourquoi je ne fais que ramener une variable. – Dev

+0

a ajouté un exemple du processus de jeton. Pour simplifier les choses, les propriétés de classe correspondent exactement à ce que vous pouvez attendre d'un jeton JWT –

0

Question 1: Oui, vous pouvez stocker le jeton sous forme de chaîne. Aucun problème avec cela.

Question 2: Dépend de la façon dont vous avez configuré. Toutefois, un jeton est normalement ajouté dans l'en-tête Autorisation et non dans le corps de la requête. Le résultat renvoyé par la requête ne doit pas contenir le jeton lui-même. Je suppose que c'est un objet Json alors il suffit d'avoir une classe POCO C# pour lui permettre de sérialiser.

Par exemple, le retour de résultat est JSON:

{ 
    "Property1": "Value1", 
    "Property2": "Value2" 
} 

Ensuite, votre classe sera

public class ReturnResult 
    { 
     [JsonProperty("Property1")] 
     public string Property1 { get; set; } 

     [JsonProperty("Property2")] 
     public string Property2 { get; set; } 
    } 
+0

Merci! Oui, j'ai créé un cours comme celui que vous avez indiqué. J'ai appelé cette classe sous la fonction d'appel GET. Mais, pas sûr de ce que c'est censé faire? var callreturn = JsonConvert.DeserializeObject (getfunctionreturnvariable); dans votre cas de classe mais quel serait le type final (dans la méthode en haut ... public static ____ getfunction (string input))? – Dev

+0

Cela dépend de votre fonction sans plus de contexte, je ne suis pas sûr de savoir comment répondre à cela :) – duongthaiha