From 495f0b16008b1f233400c2b784933897635aaf2b Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Wed, 27 Apr 2022 03:37:23 +0200 Subject: [PATCH] Logout implementation attempt #2 --- backend/src/application.ts | 8 ++--- backend/src/bindings.ts | 2 +- .../src/graphql-resolvers/user-resolver.ts | 16 +++++----- backend/src/services/auth.service.ts | 25 ++------------- backend/src/szakdolgozat-auth-checker.ts | 32 +++++++++++++++++++ 5 files changed, 47 insertions(+), 36 deletions(-) create mode 100644 backend/src/szakdolgozat-auth-checker.ts diff --git a/backend/src/application.ts b/backend/src/application.ts index ab403bd..c0b1678 100644 --- a/backend/src/application.ts +++ b/backend/src/application.ts @@ -1,5 +1,5 @@ import { BootMixin } from '@loopback/boot'; -import { Application, ApplicationConfig, BindingScope } from '@loopback/core'; +import { Application, ApplicationConfig } from '@loopback/core'; import { RepositoryMixin } from '@loopback/repository'; import { ServiceMixin } from '@loopback/service-proxy'; import { AuthenticationBindings, AuthenticationComponent } from '@loopback/authentication'; @@ -13,6 +13,7 @@ import { AuthService, SzakdolgozatUserService } from './services'; import { GraphQLBindings, GraphQLServer } from '@loopback/graphql'; import { UserResolver } from './graphql-resolvers/user-resolver'; import { SzakdolgozatBindings } from './bindings'; +import { SzakdolgozatAuthChecker } from './szakdolgozat-auth-checker'; export { ApplicationConfig }; @@ -37,11 +38,10 @@ export class SzakdolgozatBackendApplication extends BootMixin( this.get(TokenServiceBindings.TOKEN_SERVICE).then(tokenService => { this.bind(AuthenticationBindings.STRATEGY).to(new JWTAuthenticationStrategy(tokenService)); }); + this.bind(GraphQLBindings.GRAPHQL_AUTH_CHECKER).toProvider(SzakdolgozatAuthChecker); this.service(SzakdolgozatUserService, UserServiceBindings.USER_SERVICE); - this.service(AuthService, {defaultScope: BindingScope.REQUEST, key: SzakdolgozatBindings.AUTH_SERVICE}); - this.get(SzakdolgozatBindings.AUTH_SERVICE).then(service => this.bind(GraphQLBindings.GRAPHQL_AUTH_CHECKER) - .to((resolverData, roles) => service.authUser(resolverData, roles))); + this.service(AuthService, SzakdolgozatBindings.AUTH_SERVICE); this.projectRoot = __dirname; this.bootOptions = { diff --git a/backend/src/bindings.ts b/backend/src/bindings.ts index c6087dc..ff9af01 100644 --- a/backend/src/bindings.ts +++ b/backend/src/bindings.ts @@ -3,5 +3,5 @@ import { AuthService } from './services'; export namespace SzakdolgozatBindings { export const AUTH_SERVICE = BindingKey.create('szakdolgozat.auth'); - //export const AUTH_TOKEN = BindingKey.create('szakdolgozat.auth.token'); + export const AUTH_TOKEN = BindingKey.create('szakdolgozat.auth_token'); } diff --git a/backend/src/graphql-resolvers/user-resolver.ts b/backend/src/graphql-resolvers/user-resolver.ts index d56d5c5..dbbd167 100644 --- a/backend/src/graphql-resolvers/user-resolver.ts +++ b/backend/src/graphql-resolvers/user-resolver.ts @@ -2,8 +2,8 @@ import { arg, authorized, GraphQLBindings, Int, mutation, query, resolver, Resol import { User } from '../models'; import { repository } from '@loopback/repository'; import { UserRepository } from '../repositories'; -import { inject } from '@loopback/core'; -import { AuthService, SzakdolgozatUserService } from '../services'; +import { Context, inject } from '@loopback/core'; +import { SzakdolgozatUserService } from '../services'; import { TokenServiceBindings, UserServiceBindings } from '@loopback/authentication-jwt'; import { TokenService } from '@loopback/authentication'; import { SecurityBindings, UserProfile } from '@loopback/security'; @@ -22,9 +22,8 @@ export class UserResolver { @inject(GraphQLBindings.RESOLVER_DATA) private readonly resolverData: ResolverData, @inject(TokenServiceBindings.TOKEN_SERVICE) public jwtService: TokenService, @inject(SecurityBindings.USER, {optional: true}) public user: UserProfile, - @inject(SzakdolgozatBindings.AUTH_SERVICE) private authService: AuthService + @inject.context() private context: Context ) { - console.log('Auth service', authService); } @mutation(returns => User) @@ -58,10 +57,11 @@ export class UserResolver { @authorized() @mutation(returns => Boolean) - async logout(): Promise { - console.log('Logout service: ', this.authService); - console.log('token:', this.authService.receivedToken); //TODO - await this.jwtService.revokeToken?.(this.authService.receivedToken); + async logout(@inject(SzakdolgozatBindings.AUTH_TOKEN) token: string): Promise { + console.log('Logout service: ', token); + console.log('Context: ', this.context?.name); + //console.log('token:', this.authService.receivedToken); //TODO + //await this.jwtService.revokeToken?.(this.authService.receivedToken); return true; } diff --git a/backend/src/services/auth.service.ts b/backend/src/services/auth.service.ts index b75dd53..2bd99fb 100644 --- a/backend/src/services/auth.service.ts +++ b/backend/src/services/auth.service.ts @@ -1,28 +1,7 @@ -import { AuthenticateFn, AuthenticationBindings, AuthenticationStrategy } from '@loopback/authentication'; -import { ExpressContext, ResolverData } from '@loopback/graphql'; -import { Getter, inject } from '@loopback/core'; -import { JWTAuthenticationStrategy } from '@loopback/authentication-jwt'; - export class AuthService { receivedToken: string; - constructor(@inject(AuthenticationBindings.AUTH_ACTION) private authenticate: AuthenticateFn, - @inject.getter(AuthenticationBindings.STRATEGY) - readonly getStrategies: Getter) { - console.log('Created auth service', new Error().stack); - } - - async authUser(resolverData: ResolverData, roles: string[]) { - const context = ( resolverData.context); - const res = await this.authenticate(context.req); - const strat = await this.getStrategies(); - // Itt már biztosan van érvényes token - console.log('This: ', this); - this.receivedToken = strat.extractCredentials(context.req); - console.log('This: ', this); - console.log('Strat: ', strat); - console.log('Creds: ', strat.extractCredentials(context.req)); - console.log('Res: ', ( res).id); - return true; + constructor() { + console.log('new auth service'); } } diff --git a/backend/src/szakdolgozat-auth-checker.ts b/backend/src/szakdolgozat-auth-checker.ts new file mode 100644 index 0000000..cdf642b --- /dev/null +++ b/backend/src/szakdolgozat-auth-checker.ts @@ -0,0 +1,32 @@ +import { AuthenticateFn, AuthenticationBindings, AuthenticationStrategy } from '@loopback/authentication'; +import { AuthChecker, ExpressContext, ResolverData } from '@loopback/graphql'; +import { Context, Getter, inject, Provider, ValueOrPromise } from '@loopback/core'; +import { JWTAuthenticationStrategy } from '@loopback/authentication-jwt'; +import { SzakdolgozatBindings } from './bindings'; +import { AuthService } from './services'; + +export class SzakdolgozatAuthChecker implements Provider { + constructor(@inject(AuthenticationBindings.AUTH_ACTION) private authenticate: AuthenticateFn, + @inject.getter(AuthenticationBindings.STRATEGY) + readonly getStrategies: Getter, + @inject(SzakdolgozatBindings.AUTH_SERVICE) private authService: AuthService, + @inject.context() private context: Context) { + console.log('new auth checker'); + } + + value(): ValueOrPromise { + return this.authUser.bind(this); + } + + async authUser(resolverData: ResolverData, roles: string[]) { + const context = ( resolverData.context); + const res = await this.authenticate(context.req); + const strat = await this.getStrategies(); + // Itt már biztosan van érvényes token + console.log('Context: ', this.context.name); + this.context.bind(SzakdolgozatBindings.AUTH_TOKEN).to(strat.extractCredentials(context.req)); + console.log('This: ', this.authService); + console.log('Res: ', ( res).id); + return true; + } +}