angular - Hvorfor kan ikke AuthHttp (angular2-jwt) injiseres som avhengighet i komponenten?


OPPDATERING: Løsning funnet

Det var ganske enkelt (selv om det var fryktelig å finne), konfigurasjonen var feil. For å få riktig oppsett oppdaterte jeg min package.json (avhengighetsseksjonen) og tsconfig.json for å være lik eksemplet på angular.io.

De mest bemerkelsesverdige av disse endringene var:

  • Oppdaterer Angular npm-pakkene fra "~4.0.0" til "~4.2.0"
  • Endre modulen i tsconfig.json fra "system" til "commonjs"

Jeg forstår ikke hvordan det endrer ting, men det fungerer!

Original spørsmål

Kontekst

Vi prøver å sette opp angular2-jwt med vårt Angular2/4-prosjekt ved å bruke eksempelkonfigurasjonen i lenken. Det er to hovedfiler:

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)
    { }
}

Feil

Kan ikke løse alle parametere for AppComponent: (?).

Når man ser på konstruktøren til AuthHttp-klassen (fra .d.ts-filen), har jeg kommet frem til at den sannsynlige årsaken er at inkluderingskoden for AuthConfig ikke fungerer korrekt, for hvis jeg prøver å opprette en instans av denne klassen, får jeg en feil som sier at konstruktøren ikke eksisterer.

Jeg har funnet denne ressursen som sier at jeg trenger å lese mer om DI, men alt ser bra ut fra min side. https://github.com/auth0/angular2-jwt/issues/88

Oppdatering: Fant ekstra informasjon

Hvis AppComponent-konstruktøren endres til å kalle new AuthConfig(), genererer det new angular2_jwt_1.AuthConfig() i den transpilerte js-filen (Dette gir en feil som sier at konstruktøren ikke eksisterer). Men hvis dette endres til new angular2_jwt_1.default.AuthConfig() manuelt i js-filen, opprettes instansen korrekt. Kan dette være relatert til årsaken?

Svar #1

Jeg kunne ikke finne den eksakte grunnen til at jeg har dette problemet, men det er mest sannsynlig konfigurasjonsbasert. Løsningen jeg har tatt i bruk er å ikke bruke angular2-jwt-biblioteket, og i stedet legge til bærertokenet til forespørselen manuelt basert på denne artikkelen om angular2 jwt-autentisering.

Følgende er hvordan man får tilgang til bærertokenet.

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

Følgende er hvordan man lager en autentisert forespørsel (Token-egenskapen henter gjeldende token fra 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());
}

Jeg leter fortsatt etter en bedre løsning og en forklaring på hvorfor det ikke ville fungere!