Ricerca nel sito web

angular - Angular2, Auth0 collegamento all'API di Fitbit, JWT necessita di 3 parti


Attualmente sto lavorando con Angular2, sto cercando di connettermi all'API di Fitbit con auth0. Sto utilizzando Angular2-JWT e il Lock.js fornito con Auth0. Finora il login e la lettura dei dati del profilo semplice funzionano perfettamente usando l'id_token generato da Lock.js, ma nel momento in cui vorrei recuperare informazioni come le attività, la richiesta all'API genera un errore.

Ma poi ho notato che oltre a questo, Lock.js fornisce anche qualcosa come Access_token. Ho sempre pensato che questo fosse quello corretto da usare.

Recupero l'id_token/access_token in questo modo.

@Injectable()
export class Auth {
  // Configure Auth0
  lock = new Auth0Lock('[CENSORED]', '[CENSORED],{});

  constructor() {
    // Add callback for lock `authenticated` event
    this.lock.on("authenticated", (authResult:any) => {
      this.lock.getProfile(authResult.idToken, function(error:any, profile:any){
          if(error){
              throw new Error(error);
          }
            localStorage.setItem('id_token', authResult.idToken);
            localStorage.setItem('access_token', authResult.accessToken);
            localStorage.setItem('profile', JSON.stringify(profile));
            console.log('ID_token: ' + authResult.idToken);
            console.log('Access_token: ' + authResult.accessToken);

      });
    });
  }

Ora, si prega di notare che recupero un Id_token e un Access_token, cerco anche di seguire il flusso Implicit Grant, e se lo interpreto correttamente, questo dovrebbe significare che devo inviare il token di autorizzazione in cambio di un access token? Ma ciò che vorrei ottenere, o almeno scoprire, è se l'Access_token che recupero usando Lock.js è quello necessario per comunicare con l'API di Fitbit? Oppure ho effettivamente bisogno dell'id_token?

La documentazione non è davvero chiara su questo. Quindi, continuando, continueremo a usare questo Access_token, procedo a usare angular2-JWT per aiutarmi a inviare un AuthHttp all'API di Fitbit. Il mio servizio di recupero delle attività che porta a questo appare come segue:

@Injectable()
export class FetchActivityService {

   constructor (
    public AuthHttp: AuthHttp
  ) {}
  activity:any;
  jwtHelper: JwtHelper = new JwtHelper();
useJwtHelper() {
  var token = localStorage.getItem('id_token');

  console.log(
    this.jwtHelper.decodeToken(token),
    this.jwtHelper.getTokenExpirationDate(token),
    this.jwtHelper.isTokenExpired(token)
  );
}
  GetActivity() {

    this.AuthHttp.get('https://api.fitbit.com/1/activities.json')
    .subscribe(data => this.activity = data, error => console.log(error));
  }


}

Quindi, in sintesi, la parte rilevante del codice consiste semplicemente nel distribuire Angular2-JWTs AuthHttp per aggiungere correttamente l'intestazione di autorizzazione alla mia richiesta API. Quindi, anche in questo caso sopra Access_token, la mia AuthHttp Factory appare come segue

export function authHttpServiceFactory(http: Http, options: RequestOptions) {
  return new AuthHttp(new AuthConfig({
    tokenName: 'access_token',
    tokenGetter: (() => localStorage.getItem('access_token'))
     }), http, options);
}

Solo per mostrarti puoi vedere che lo sto collegando al Access_token generato direttamente da Lock.js. Quindi, non appena cerco di eseguire GetActivity() come indicato sopra, ricevo il seguente errore:

Error: JWT must have 3 parts

Questo è l'intero messaggio di errore, non lo capisco, Angular2 JWT dovrebbe usare Access_token per generare un JWT valido e inviarlo all'API, quindi cosa ho sbagliato? Posso anche dire che Access_token, quando viene stampato nella console, è una stringa abbastanza corta, mentre Id_token è già un JWT.

Ora per favore immagina tutti i passaggi sopra ma con access_token sostituito da Id_token, ciò genera il seguente errore. Il testo rosso mostra un lungo JWT, non l'ho inserito qui perché è molto lungo.

"errorType":"invalid_token","message":"Access token invalid:[JWT]

Sono completamente perso in questo.