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.