IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Discussion :

web token je suis perdu


Sujet :

Services Web

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Points : 26
    Points
    26
    Par défaut web token je suis perdu
    Bonjour à tous.

    Je développe actuellement un robot de trading et voudrai le mettre a l'épreuve mais je n'arrive pas à m'autentifier avec un JWT. J'ai l'exemple suivant que j'aimerai traduire en c# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    require 'uri'
    require 'net/http'
    require 'time'
    require 'jwt'
     
    uri = URI.parse("https://api.quoine.com")
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
     
    token_id = 'YOUR_API_TOKEN_ID'
    user_secret = 'YOUR_API_SECRET'
    path = '/orders?product_id=1'
     
    auth_payload = {
      path: path,
      nonce: DateTime.now.strftime('%Q'),
      token_id: token_id
    }
     
    signature = JWT.encode(auth_payload, user_secret, 'HS256')
     
    request = Net::HTTP::Get.new(path)
    request.add_field('X-Quoine-API-Version', '2')
    request.add_field('X-Quoine-Auth', signature)
    request.add_field('Content-Type', 'application/json')
     
    response = http.request(request)
    Je n'arrive absolument à rien, j'ai trouvé beaucoup d'exemple pour utiliser les JWT mais je n'arrive pas à en faire fonctionner un seul, j'ai a chaque fois beaucoup de classes inexistantes même après avoir chargé les packages (nugets). J'ai très peu voir aucune connaissance au niveau de l'utilisation des requêtes http etc.. et du coup je ne sais pas avec quoi créer ceci...
    Pour le moment j'utilise des requêtes du genre httpClient.GetStringAsync(URL) et des connections websocket qui fonctionnent mais là je n'arrive à rien du tout.

    Si quelqu’un pouvait m'aider je serai ravi.

    Je ne sais pas comment encoder
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
        public class JWTRequest
        {
            public static string test = @"/orders?product_id=1";
            public const string key = @"my/key";
            public const string tokenId = "417055";
            private static int increment = 0;
     
            public static string Encode()
            {
     
                increment++;
                var payload = new
                {
                    path = test ,
                    nonce = increment,
                    token_id = tokenId
                };
     
                return ??? ??? Encode(payload, key, HS256);
            }
        }
    Je ne sais pas non plus quoi utiliser pour envoyer la requetes, webRequest, httprequest... quelle classe va me permettre d'ajouter les valeures contenues dans les Add_field de l'exemple?

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    Finalement je crois arriver à quelque chose pour l'encodage, mon probleme etait que j'utilisais les namespaces :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    using System.IdentityModel.Tokens;
    using System.IdentityModel.Tokens.Jwt;
    alors qu'il faut aujourd'hui utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    using Microsoft.IdentityModel.Tokens;
    using System.IdentityModel.Tokens.Jwt;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
        public class JWT1
        {
            private static int increment = 0;
            private const string key = @"myKeyqdoihhkubgsdcfvsqdofi/pihj";
            public static string Encode(string request = "")
            {
                request = @"/orders?product_id=1";//for test purpose
                increment++;
     
                SymmetricSecurityKey securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key));
     
                SigningCredentials credentials = new SigningCredentials
                                  (securityKey, SecurityAlgorithms.HmacSha256Signature);
     
                JwtHeader header = new JwtHeader(credentials);
     
                //Some PayLoad that contain information about the  customer
                JwtPayload payload = new JwtPayload
               {
                   { "path ", request},
                   { "nonce", increment},
                    {"token_id",417055 }
               };
     
                JwtSecurityToken secToken = new JwtSecurityToken(header, payload);
                JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
     
                return handler.WriteToken(secToken);
     
     
            }
    }
    Par contre j'ai toujour la question de l'envoie par rapport à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    uri = URI.parse("https://api.quoine.com")
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
     
    request = Net::HTTP::Get.new(path)
    request.add_field('X-Quoine-API-Version', '2')
    request.add_field('X-Quoine-Auth', signature)
    request.add_field('Content-Type', 'application/json')
     
    response = http.request(request)
    Quelles classes dois-je utiliser?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    Je tien un truc mais ça ne fonctionne pas du tout, je recois la page https://api.quoine.com en html alors que j'attend un Json.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
        public class JWT1
        {
            private const string key = "key/Mkey";
     
            public static void Test()
            {
                GetRequest("/orders?product_id=1");
            }
     
            private static void GetRequest(string getString)
            {
                WebRequest request = WebRequest.Create("https://api.quoine.com");
                request.Method = "GET";
                request.Timeout = 12000;
                request.ContentType = "application/json";
                request.Headers.Add("X-Quoine-API-Version", "2");
                request.Headers.Add("X-Quoine-Auth", Encode(getString));
     
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream stream = response.GetResponseStream();
                StreamReader reader = new StreamReader(stream);
     
                Debug.WriteLine("StatuDesc : " + response.StatusDescription);
                Debug.WriteLine("Statucode : " + response.StatusCode);
                Debug.WriteLine("Charac : " + response.CharacterSet);
                Debug.WriteLine("Stream : "+ reader.ReadToEnd());
     
                response.Close();
            }
            private static string Encode(string request)
            {
                SymmetricSecurityKey securityKey = new Microsoft
                   .IdentityModel.Tokens.SymmetricSecurityKey(Encoding.UTF8.GetBytes(key));
     
                SigningCredentials credentials = new SigningCredentials
                                  (securityKey, SecurityAlgorithms.HmacSha256Signature);
     
                JwtHeader header = new JwtHeader(credentials);
     
                JwtPayload payload = new JwtPayload
               {
                   { "path ", request},
                   { "nonce", DateTime.Now.Ticks},
                    {"token_id",417055 }
               };
     
                JwtSecurityToken secToken = new JwtSecurityToken(header, payload);
                JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
     
                return handler.WriteToken(secToken);
     
     
            }
        }
    Je reçois exactement la même chose que si je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                WebRequest request = WebRequest.Create("https://api.quoine.com");
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream stream = response.GetResponseStream();
                StreamReader reader = new StreamReader(stream);
                Debug.WriteLine("StatuDesc : " + response.StatusDescription);
                Debug.WriteLine("Statucode : " + response.StatusCode);
                Debug.WriteLine("Charac : " + response.CharacterSet);
                Debug.WriteLine("Stream : "+ reader.ReadToEnd());

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    Si ça peut aider voici une methode qui fonctionne avec les requêtes qui n'ont pas besoin d'autentification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
            public void GetData()
            {
                GetNewDataAsync<MyDataClass>("https://api.quoine.com/products/1/price_levels");
            }
            protected async virtual void GetNewDataAsync<TData>(string URL)
            {
                using (var httpClient = new HttpClient())
                {
                    string jsohn = "";
                    try
                    {
                        jsohn = await httpClient.GetStringAsync(URL);
                    }
                    catch (Exception)
                    {
                        GetNewDataAsync<TData>(URL);
                        return;
                    }
                    TData data = (TData)JsonConvert.DeserializeObject(jsohn, typeof(TData));
                }
            }

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    J'ai créer un token en readOnly, ducoup je peux partager le token et la clef si quelqun veut faire des tests.
    Voici la class complete, j'ai vraiment besoin d'un coup de pouce :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     public class JWT1
        {
            private const string tokenId = "419506";
            private const string key = "/V2qzwXZ6+inAQ/ygqTUMq5yEYOZBOSVzOEK6wjGJuh/YpaP/y7a1ge8s03ycEWVcAgaQt1ghmNRg5Izk3nHNw==";
     
            public static void Test()
            {
                GetRequest("/orders?product_id=1");
            }
     
            private static void GetRequest(string getString)
            {
                string encoded = Encode(getString);
     
                WebRequest request = WebRequest.Create("https://api.quoine.com"+ getString);
                request.Method = "GET";
                request.Timeout = 12000;
                request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequired;
                request.ContentType = "application/json";
                request.Headers.Add("X-Quoine-API-Version", "2");
                request.Headers.Add("X-Quoine-Auth", encoded);
                WebResponse response = null;
     
                try
                {
                    response = request.GetResponse();
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    Stream stream = response.GetResponseStream();
                    StreamReader reader = new StreamReader(stream);
                    Debug.WriteLine("encoded : " + encoded);
                    //Debug.WriteLine("StatuDesc : " + response.StatusDescription);
                    //Debug.WriteLine("Statucode : " + response.StatusCode);
                    //Debug.WriteLine("Charac : " + response.CharacterSet);
                    Debug.WriteLine("Stream : " + reader.ReadToEnd());
                    response.Close();
                }
     
            }
            private static string Encode(string request)
            {
                SymmetricSecurityKey securityKey = new SymmetricSecurityKey(Convert.FromBase64String(key));
     
                SigningCredentials credentials = new SigningCredentials
                                  (securityKey, SecurityAlgorithms.HmacSha256Signature, SecurityAlgorithms.Sha256Digest);
     
                JwtHeader header = new JwtHeader(credentials);
     
                JwtPayload payload = new JwtPayload
               {
                   { "path ", request},
                   { "nonce", DateTime.Now.Ticks},
                    {"token_id",tokenId }
               };
     
                JwtSecurityToken secToken = new JwtSecurityToken(header, payload);
                JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
     
                return handler.WriteToken(secToken);
     
     
            }
        }

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Ton code a l'air correct, mais ton Token JWT n'est pas bon. Peux-tu m'envoyer en message prive ton Token ID et ton User Secret ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    Deja inclue dans le post precedent, en read only normalement ça devrai fonctionner avec la requete incluse aussi (enfin je parle de la key, j'ai pas autre chose).

  8. #8
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Ok, j'etais pas sur que ce soit ca ! A chaque fois on se prend une erreur HTTP 401: Unauthorized. D'apres la doc, cette exception signifie :
    Token is invalid. If your API key is wrong a 401 will also be served, so check the response body, it might be that the API_KEY is invalid.
    Pourtant dans notre cas le corps de la reponse indique juste "Path does not match". Aucune indication que la cle n'est pas bonne.

    Je te conseille d'ouvrir un ticket aupres de leur support pour voir ce qui cloche...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    Malheurusement le support est telement surchargé que j'ai un ticket ouvert depuis plus d'un mois (pour un accés à leur websocket il faut une clef Pusher que l'ont doit leur demander...) et toujours pas de reponse, ils ont un chat et me renvoie eux aussi vers le support donc je vais devoir me debrouiller.

    En tout cas merci pour ton aide, comment fais tu pour lire le "corp"? Aussi à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WebRequest request = WebRequest.Create("https://api.quoine.com"+ getString);
    Si j'utilise cette ligne j'ai l'erreur 401, par contre si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WebRequest request = WebRequest.Create("https://api.quoine.com");
    Je reçois la page https://api.quoine.com en html.

    Tout comme si les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                request.Method = "GET";
                request.Timeout = 12000;
                request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequired;
                request.ContentType = "application/json";
                request.Headers.Add("X-Quoine-API-Version", "2");
                request.Headers.Add("X-Quoine-Auth", encoded);
    Ne servaient absoluement à rien. Je pense qu'il y a une autre maniere de faire et que celle çi n'est pas la bonne.

  10. #10
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    C'est la bonne facon a priori. Malheureusement la doc est tres insuffisante et l'API n'est pas suffisamment bavarde, donc je ne peux pas t'aider plus. Il faut que tu attendes que ton ticket soit traite.

    Pour les requtes sur API j'utilise Postman. Ca te permet de voir tous les elements de maniere plus user-friendly que via le code.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    Ok, postman a l'air pratique en effet je viens de le charger. Je repasserai ici quand la solution aura été trouvé. Merci encore, a plus tard...

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    Salut, j'ai quelques nouvelles, un utilisateur Quoinex m'a filé un coup de pouce pour les test et surtout m'a envoyé un resultat de token qui fonctionne chez lui, ce qui m'a permis de deceler deux problemes sur le payload :
    "path " au lieu de "path", id_token est un int et non un string.

    Par contre il y a un autre proble que je n'arrive pas a resoudre, la clef n'est pas encodé en base64 dans son cas et je n'arrive pas a creer une SymmetricSecurityKey avec un string, il veut un byte et je ne trouve pas d'autre moyen de faire ceci.

  13. #13
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par ChapsF Voir le message
    "path " au lieu de "path"
    J'avais corrige ca dans mon code, mais ca ne change pas le message recu...

    Citation Envoyé par ChapsF Voir le message
    id_token est un int et non un string.
    id_token ou token_id ??

    Citation Envoyé par ChapsF Voir le message
    Par contre il y a un autre proble que je n'arrive pas a resoudre, la clef n'est pas encodé en base64 dans son cas et je n'arrive pas a creer une SymmetricSecurityKey avec un string, il veut un byte et je ne trouve pas d'autre moyen de faire ceci.
    Tu peux utiliser ceci :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var bytes = Encoding.UTF8.GetBytes("la cle qu'on t'a file");
    var base64 = Convert.ToBase64String(bytes);
     
    var securityKey = new SymmetricSecurityKey(Convert.FromBase64String(base64));
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

Discussions similaires

  1. [ODBC] Je suis perdu avec ODBC
    Par Nowhere dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 19/05/2006, 08h50
  2. [Tableaux] aide je suis perdu
    Par covin85 dans le forum Langage
    Réponses: 12
    Dernier message: 14/04/2006, 17h56
  3. [Architecture] EJB ou pas EJB ? Je suis perdu ...
    Par n!co dans le forum Java EE
    Réponses: 18
    Dernier message: 26/01/2006, 18h21
  4. RAM DDR, PC3200, 333Mhz , 400Mhz je suis perdu
    Par ahage4x4 dans le forum Composants
    Réponses: 2
    Dernier message: 08/12/2005, 17h52
  5. DLL et MainForm je suis perdu !
    Par rudy2 dans le forum C++Builder
    Réponses: 28
    Dernier message: 02/01/2005, 18h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo