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.