Vyhledávání na webu

angular - Proč nelze AuthHttp (angular2-jwt) závislostně injektovat do komponenty?


AKTUALIZACE: Řešení nalezeno

Bylo to poměrně jednoduché (i když děsivé na nalezení), konfigurace byla špatná. Abych získal správné nastavení, aktualizoval jsem svůj soubor package.json (část závislostí) a tsconfig.json tak, aby byly podobné ukázce na angular.io.

Nejpozoruhodnější z těchto změn byly:

  • Aktualizace balíčků Angular npm z "~4.0.0" na "~4.2.0"
  • Změna modulu v tsconfig.json z "system" na "commonjs"

Nerozumím, jak to mění věci, ale funguje to!

Původní otázka

Kontext

Snažíme se nastavit angular2-jwt s naším projektem Angular2/4 pomocí ukázkové konfigurace v odkazu. Jsou zde dva hlavní soubory:

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

Chyba

Nelze vyřešit všechny parametry pro AppComponent: (?).

Při pohledu na konstruktor třídy AuthHttp (ze souboru .d.ts) jsem dospěl k závěru, že pravděpodobným viníkem je to, že zahrnutí pro AuthConfig nefunguje správně, protože pokud se pokusím vytvořit instanci této třídy, zobrazí se chyba s informací, že konstruktor neexistuje.

Našel jsem tento zdroj, který říká, že si musím více nastudovat DI, ale z mé strany vše vypadá v pořádku. https://github.com/auth0/angular2-jwt/issues/88

Aktualizace: Nalezeny další informace

Pokud je konstruktor AppComponent změněn tak, aby volal new AuthConfig(), v přeloženém souboru js se vygeneruje new angular2_jwt_1.AuthConfig() (tato chyba uvádí, že konstruktor neexistuje). Nicméně, pokud je to ručně změněno v souboru js na new angular2_jwt_1.default.AuthConfig(), instance se vytvoří správně. Může to souviset s příčinou?

Odpověď č. 1

Nemohl jsem najít přesný důvod, proč mám tento problém, ale je to s největší pravděpodobností založeno na konfiguraci. Řešení, které jsem použil, je nepoužívat knihovnu angular2-jwt a místo toho přidat bearer token k požadavku ručně na základě tohoto článku o autentizaci angular2 jwt.

Následuje návod, jak získat nositele tokenu.

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

Následuje návod, jak provést ověřený požadavek (vlastnost Token získá aktuální token z 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());
}

Stále hledám lepší řešení a vysvětlení, proč by to nefungovalo!