angular - Angular2, Auth0 povezivanje s Fitbit API-jem, JWT treba 3 dijela


Trenutno radim s Angular2, pokušavam se povezati s fitbit API-jem koristeći auth0. Koristim Angular2-JWT i Lock.js koji pruža Auth0. Do sada prijava i čitanje osnovnih podataka profila rade besprijekorno koristeći id_token generiran pomoću Lock.js, ali u trenutku kada želim dohvatiti informacije poput aktivnosti, zahtjev prema API-ju daje grešku.

Ali onda sam primijetio Osim toga, Lock.js također daje nešto poput Access_token. Uvijek sam mislio da je to ispravno za koristiti.

ID_token/access_token dohvaćam na sljedeći način.

@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);

      });
    });
  }

Sada, molim vas imajte na umu da dohvaćam Id_token i Access_token, također pokušavam slijediti Implicit Grant tok, i ako ga ispravno interpretiram, to bi trebalo značiti da moram poslati autorizacijski token u zamjenu za access token? Ali ono što bih zapravo želio postići, ili barem saznati, je li Access_token koji dohvaćujem pomoću Lock.js onaj koji je potreban za komunikaciju s Fitbit API-jem? Ili mi zapravo treba id_token?

Dokumentacija zaista nije jasna oko ovoga. Dakle, idemo dalje, nastavimo koristiti ovaj Access_token, ja nastavim koristiti angular2-JWT da mi pomogne poslati AuthHttp prema fitbit API-ju. Moja usluga dohvaćanja aktivnosti koja vodi do ovoga izgleda kao sljedeće:

@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));
  }


}

Tako hrabro, relevantni dio koda samo implementira Angular2-JWT AuthHttp kako bi ispravno dodao zaglavlje autorizacije u moj API zahtjev. Dakle, u ovom slučaju još uvijek Access_token, pa moja AuthHttp tvornica izgleda ovako

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

Samo da pokažem, možete vidjeti da ga povezujem s Access_tokenom generiranim direktno iz Lock.js. Dakle, čim pokušam pokrenuti GetActivity() kako je navedeno gore, dobivam sljedeću pogrešku:

Error: JWT must have 3 parts

To je cijela poruka o pogrešci, ne razumijem, Angular2 JWT trebao bi koristiti Access_token za generiranje valjanog JWT-a i slanje toga API-ju, pa što sam pogriješio? Mogu li također reći da je Access_token, kada se ispiše u konzoli, prilično kratak niz, dok je Id_token već JWT.

Sada zamislite sve gore navedene korake, ali umjesto access_token koristite Id_token, to daje sljedeću pogrešku. Crveni tekst prikazuje dug JWT, nisam ga ovdje stavio jer je vrlo dug.

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

Potpuno sam izgubljen u ovome.