I am creating a guard, authentication part was working but when I created auth-guard.guard.ts then I got several errors:
Error: src/app/app.module.ts:52:7 - error TS2322: Type '{ AuthService: typeof AuthService; provide: InjectionToken<HttpInterceptor[]>; useClass: typeof AuthInterceptor; multi: true; }' is not assignable to type 'Provider'. Object literal may only specify known properties, and 'AuthService' does not exist in type 'Provider'.
52 AuthService, ~~~~~~~~~~~ Error: src/app/auth/guard/auth-guard.ts:4:10 - error TS2305: Module '"../../shared/token.service"' has no exported member
'AuthService'.
4 import { AuthService } from '../../shared/token.service'; ~~~~~~~~~~~ Error: src/app/auth/guard/auth-guard.ts:10:23 - error NG2003: No suitable injection token for parameter '_authService' of class
'AuthGuard'. Consider using the @Inject decorator to specify an injection token.
10 constructor(private _authService: AuthService, private _router: Router) { } ~~~~~~~~~~~~ src/app/auth/guard/auth-guard.ts:10:37 10 constructor(private _authService: AuthService, private _router: Router) { } ~~~~~~~~~~~ This type does not have a value, so it cannot be used as injection token.
auth/guard/auth-guard.guard.ts
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot, UrlTree,Router } from '@angular/router';
import { Observable } from 'rxjs';
import { AuthService } from '../../shared/token.service';
@Injectable({
providedIn: 'root'
})
export class AuthGuardGuard implements CanActivate {
constructor(private _authService: AuthService, private _router: Router) { }
canActivate(): boolean {
if (this._authService.isLoggedIn()) {
return true;
} else {
this._router.navigate(['/login'])
return false
}
}
}
shared/token.service
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class TokenService {
private issuer = {
login: 'http://127.0.0.1:8000/api/auth/login',
register: 'http://127.0.0.1:8000/api/auth/register'
}
constructor() { }
handleData(token : any){
localStorage.setItem('auth_token', token);
}
getToken(){
return localStorage.getItem('auth_token');
}
// Verify the token
isValidToken(){
const token = this.getToken();
if(token){
const payload = this.payload(token);
if(payload){
return Object.values(this.issuer).indexOf(payload.iss) > -1 ? true : false;
}
} else {
return false;
}
}
payload(token : any) {
const jwtPayload = token.split('.')[1];
return JSON.parse(atob(jwtPayload));
}
// User state based on valid token
isLoggedIn() {
return this.isValidToken();
}
// Remove token
removeToken(){
localStorage.removeItem('auth_token');
}
}
shared/auth.service.ts
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { HttpClient } from '@angular/common/http';
// User interface
export class User {
name: String;
email: String;
password: String;
password_confirmation: String
}
@Injectable({
providedIn: 'root'
})
export class AuthService {
constructor(private http: HttpClient) { }
// User registration
register(user: User): Observable<any> {
return this.http.post('http://127.0.0.1:8000/api/auth/register', user);
}
// Login
signin(user: User): Observable<any> {
return this.http.post<any>('http://127.0.0.1:8000/api/auth/login', user);
}
// Access user profile
profileUser(): Observable<any> {
return this.http.get('http://127.0.0.1:8000/api/auth/user-profile');
}
}
app.modules.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { HomeComponent } from './home/home.component';
import { RagisterComponent } from './ragister/ragister.component';
import { LoginComponent } from './login/login.component';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { HeaderComponent } from './header/header.component';
import { FooterComponent } from './footer/footer.component';
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
import { ReactiveFormsModule, FormsModule } from '@angular/forms';
import { CommonModule } from '@angular/common';
import { AuthInterceptor } from './shared/auth.interceptor';
import { AuthService } from './shared/auth.service';
@NgModule({
declarations: [
AppComponent,
HomeComponent,
...
],
imports: [
BrowserModule,
AppRoutingModule,
HttpClientModule,
ReactiveFormsModule,
BrowserAnimationsModule,
CarouselModule,
FormsModule,
CommonModule
],
providers: [
{
AuthService,
provide: HTTP_INTERCEPTORS,
useClass: AuthInterceptor,
multi: true
}
],
bootstrap: [AppComponent]
})
export class AppModule { }
routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { LoginComponent } from './login/login.component';
import { PagenotfoundComponent } from './pagenotfound/pagenotfound.component';
import { RagisterComponent } from './ragister/ragister.component';
import { UserdashboardComponent } from './userdashboard/userdashboard.component';
import { AuthGuard } from './auth/guard/auth-guard.guard';
const routes: Routes = [
{path:'',component:HomeComponent},
{path:'login',component:LoginComponent},
{path:'ragister',component:RagisterComponent},
{path:'dashboard',component:UserdashboardComponent,canActivate: [AuthGuard]}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
Any Solution, Thanks
CodePudding user response:
Your guard is called AuthGuardGuard
instead of AuthGuard
. You probably created it with
ng generate guard AuthGuard
instead of
ng generate guard Auth
You can just rename the file and class or delete/recreate (preferred solution)
CodePudding user response:
I think the problem is with the Auth Guard Class name.
You should either change the auth guard class name from AuthGuardGuard
to AuthGuard
OR
Change it in routing.module.ts
from
import { AuthGuard } from './auth/guard/auth-guard.guard';
{path:'dashboard',component:UserdashboardComponent,canActivate: [AuthGuard]}
TO
import { AuthGuardGuard } from './auth/guard/auth-guard.guard';
{path:'dashboard',component:UserdashboardComponent,canActivate: [AuthGuardGuard]}