Bonjour,

Je me permets de poster sur ce forum parce que j'ai un problème épineux qui dure depuis plusieurs mois. Et je voudrais réellement trouver une solution.

J'ai développé un site sous Symfony, avec un petit intranet et donc une gestion utilisateur / données ... J'ai aussi ajouté une API (en cours de dév) qui permets à l'utilisateur de toucher certaines ressources.
J'ai utilisé les bundles classiques FOSRestBundle, FOSUserBundle, NelmioApiDocBundle, ...

Je voudrais développer une application mobile qui se connecte donc sur cette API et qui me permette, via une authentification sure, d'exécuter des requêtes.
Il y as plusieurs mois, j'avais beaucoup travaillé avec Ionic en version 1, et donc angular JS. Côté Symfony, j'avais essayé le protocole Oauth, avec FosOauthServerBundle et les token JWT avec LexikJwtAuthenticationBundle. J'avais eu des problèmes de Preflight request et de headers doublés à l'envoi du serveur .... Impossible de m'en sortir, et malgré plusieurs postes sur stackoverflow et sur les git, je n'ai pas trouvé la source du problème.

Aujourd'hui, je travaille sur Ionic2 avec Angular2, et je reprends une solution basée sur JWT. J'ai un backend opérationnel, que j'ai pu tester avec Curl, et j'arrive bien à récupérer mon token, et à émettre une requête avec le bon header. J'ai crée un nouveau projet vierge, juste pour pouvoir tester sur un environnement clean. Je n'y ai mis que le strict nécessaire pour faire mon authentification.

Mais je coince toujours sur l'authentification côté application mobile...
Encore une fois, j'ai effectué beaucoup de recherches sur le net, et je trouve que c'est difficile de trouver des documentations claires (ou c'est moi qui coince :s)
Je fais mes essais actuels avec angular2-jwt qui devrait me permettre en théorie de résoudre mon problème, mais mes premiers essais ne sont pas une réussite.
https://auth0.com/blog/ionic-2-authentication-how-to-secure-your-mobile-app-with-jwt/

Donc je me demandais si vous auriez des conseils ? une idée à laquelle je n'ai pas pensé ? une autre technologie ?

A terme, si j'arrive (enfin j'espère) à résoudre ce problème, je voudrais faire un bel article expliquant le processus, côté serveur, et côté application mobile.

6 réponses


Au vu des réponses, je continue mes recherches seul.

Afin de me familiariser avec le Typescript, j'ai suivi plusieurs tutos, et réalisé 2 applications bateaux from sratch pour mieux comprendre le fonctionnement de ionic, mais aussi d'angular2.

Je reprends donc le tuto de auth0, et je ne comprends pas certaines de leur manipulations ... Notamment pourquoi utilisent ils le service http au lieu du leur authHttp ?
https://auth0.com/blog/introducing-angular2-jwt-a-library-for-angular2-authentication/

Si ça intéresse quelqu'un, je reviendrais poster ici.
Sinon bonne continuation.

Notamment pourquoi utilisent ils le service http au lieu du leur authHttp ?

Ils utilisent http pour laconnexion. Leur service AuthHttp rajoute les donnees de connexion dans le header et ne peut donc pas etre utiliser pour se connecter.

Merci pour cette réponse =)
j'aurais cru que le service AuthHttp surcharger le service http standard.

je continue mes tests, mais sur le tuto auth0 le formulaire ne marche pas bien, la page est buggé. Je refais un service indépenant, en me basant sur leur exemple.

Après de nombreux tests, je bloque toujours et encore sur un problème :

Lors de l'authentification avec la fonction authSuccess, j'ai un beau message d'erreur :
"browser_adapter.js:84 ORIGINAL EXCEPTION: Error: JWT must have 3 parts"

Pourtant un console.log me donne comme token :
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6IlF1b3ZhbmRpdXMiLCJleHRyYSI6IiIsImlkIjoyLCJpYXQiOjE0NzQyMTI3NzIsImV4cCI6MTQ3NDIzMDc3Mn0.lVG1Y-ZX8bZN3JLsICa19IpS3nbdItMFDpaHa2nbBMQ"

Si j'ai bien compris chaque partie doit être séparée par un point, donc il y as bien les 3 parties demandées dans le jeton.

Dans cette version j'ai fait un formulaire de login le plus simple possible :

<ion-list>
        <ion-item>
            <ion-label floating>Username</ion-label>
            <ion-input [(ngModel)]="username" type="text"></ion-input>
        </ion-item>

          <ion-item>
              <ion-label floating>Password</ion-label>
              <ion-input [(ngModel)]="password" type="password"></ion-input>
          </ion-item>
      </ion-list>

      <div padding>
          <button primary block (click)="login()">Sign In</button>
      </div>

la fonction login :

login() {
        console.log('function login called !');
        let credentials = {
            username: this.username,
            password: this.password,
      };

      console.log(credentials);

      this.http.post(`http://localhost:3001/sessions/create`, JSON.stringify(credentials), {headers: this.contentHeader})
          .map(res => res.json())
          .subscribe(
              data => this.authSuccess(data),
              err => console.log(err),
              () => console.log('login completed !')
          );
  }

  authSuccess(token) {
      console.log('function authSuccess called !');
      console.log(token);
      // "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6IlF1b3ZhbmRpdXMiLCJleHRyYSI6IiIsImlkIjoyLCJpYXQiOjE0NzQwMzA1MzYsImV4cCI6MTQ3NDA0ODUzNn0.o_q9lpgE-gRnjQO7rHBrw6yL0aJ7NYv_6C8nE7N-r-c"
      // eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6IlF1b3ZhbmRpdXMiLCJleHRyYSI6IiIsImlkIjoyLCJpYXQiOjE0NzQyMTI3NzIsImV4cCI6MTQ3NDIzMDc3Mn0.lVG1Y-ZX8bZN3JLsICa19IpS3nbdItMFDpaHa2nbBMQ

      this.error = null;
      this.local.set('id_token', token);
      console.log(this.jwtHelper);
      console.log(token);

      this.user = this.jwtHelper.decodeToken(token).username;
      console.log(this.user);
}

Je ne pense pas que ça vienne du serveur puisque j'utilise le serveur prévu :
https://github.com/auth0-blog/nodejs-jwt-authentication-sample

Et que mes requêtes directes fonctionnent bien.

J'ai laissé un message sur le github du projet, puisque je pense que ça viendrais de la fonction decodeToken qui doit avoir un erreur ?_?

As tu essayé de décoder ton token sur le site jwt.io ?

Non je ne connaissais pas.

J'ai réussi à valider le token renvoyé, avec la passphrase du serveur.
Il me renvoie bien mon username, un id, et un extra vide.

Donc il semblerait que le token n'ait pas de souci