Ricerca nel sito web

angular - Perché AuthHttp (angular2-jwt) non può essere iniettato come dipendenza in un componente?


AGGIORNAMENTO: Soluzione Trovata

Era piuttosto semplice (anche se orribile da trovare), la configurazione era sbagliata. Per ottenere la configurazione corretta ho aggiornato il mio package.json (sezione dipendenze) e tsconfig.json per essere simili all'esempio di angular.io.

Le più notevoli di queste modifiche erano:

  • Aggiornamento dei pacchetti npm di Angular da "~4.0.0" a "~4.2.0"
  • Modificare il modulo in tsconfig.json da "system" a "commonjs"

Non capisco come questo cambi le cose, ma funziona!

Domanda originale

Contesto

Stiamo cercando di configurare angular2-jwt con il nostro progetto Angular2/4 utilizzando la configurazione di esempio nel link. Ci sono due file principali:

app.module.ts

import { AuthConfig, AuthHttp } from 'angular2-jwt';
import { NgModule } from '@angular/core';
import { HttpModule, Http, RequestOptions } from '@angular/http';
import { BrowserModule } from '@angular/platform-browser';

import { AppRoutingModule, routingComponents } from './app.routing';

import { AppComponent } from './Components/app.component';

@NgModule({
    imports: [BrowserModule, HttpModule, AppRoutingModule],
    declarations: [AppComponent, routingComponents],
    bootstrap: [AppComponent],
    providers: [
        {
            provide: AuthHttp,
            useFactory: (http: Http, options: RequestOptions) => new AuthHttp(new AuthConfig(), http, options),
            deps: [Http, RequestOptions]
        }]
})
export class AppModule { }

app.component.ts

import { Component } from '@angular/core';
import { AuthHttp } from 'angular2-jwt';

@Component({
    selector: "app",
    templateUrl: "/App/Components/app.component.html"
})
export class AppComponent
{
    constructor(service: AuthHttp)
    { }
}

Errore

Impossibile risolvere tutti i parametri per AppComponent: (?).

Guardando il costruttore della classe AuthHttp (dal file .d.ts), ho ritenuto che il colpevole probabile sia che l'inclusione di AuthConfig non stia funzionando correttamente, perché se provo a creare un'istanza di questa classe dà errore indicando che il costruttore non esiste.

Ho trovato questa risorsa che dice che devo approfondire di più DI, ma tutto sembra a posto da parte mia. https://github.com/auth0/angular2-jwt/issues/88

Aggiornamento: Trovate informazioni aggiuntive

Se il costruttore di AppComponent viene modificato per chiamare new AuthConfig(), questo genera new angular2_jwt_1.AuthConfig() nel file js traspostato (Il quale dà errore affermando che il costruttore non esiste). Tuttavia, se questo viene modificato manualmente in new angular2_jwt_1.default.AuthConfig() nel file js, crea l'istanza correttamente. Potrebbe questo essere correlato alla causa?

Risposta n. 1

Non sono riuscito a trovare la ragione esatta per cui sto riscontrando questo problema, ma molto probabilmente è dovuto alla configurazione. La soluzione temporanea che ho adottato è di non usare la libreria angular2-jwt e invece aggiungere manualmente il token bearer alla richiesta basandomi su questo articolo sull'autenticazione jwt in angular2.

Quanto segue spiega come ottenere il token del portatore.

public Login(username: string, password: string): Observable<boolean>
{
    // Prepare post headers
    var headers: Headers = new Headers();
    headers.append('Content-Type', 'application/x-www-form-urlencoded');

    // Prepare credential request
    var body: string = "grant_type=password&scope=scopes go here&username=" + username + "&password=" + password;

    return this.http
        .post("token url here", body, { headers: headers })
        .map((response: Response) =>
        {
            let token = response.json();
            token = token && token.access_token;
            if (!token)
                return false;
            else
            {
                localStorage.setItem('username', username);
                localStorage.setItem('token', token);
                return true;
            }
        });
}

Ecco come fare una richiesta autenticata (la proprietà Token ottiene il token corrente da localStorage).

public Post<T>(url: string, body: string): Observable<T>
{
    let headers = new Headers({ 'Authorization': 'Bearer ' + this.Token });
    let options = new RequestOptions({ headers: headers });

    return this.http
        .post(url, body)
        .map((response: Response) => response.json());
}

Sto ancora cercando una soluzione migliore e una spiegazione del perché non funzionerebbe!