auth.resolver.ts 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { Args, Context, Mutation, Query, Resolver } from '@nestjs/graphql';
  2. import {
  3. AuthenticationResult,
  4. MutationAuthenticateArgs,
  5. MutationLoginArgs,
  6. NativeAuthenticationResult,
  7. Permission,
  8. Success,
  9. } from '@vendure/common/lib/generated-types';
  10. import { Request, Response } from 'express';
  11. import { NativeAuthStrategyError } from '../../../common/error/generated-graphql-admin-errors';
  12. import { NATIVE_AUTH_STRATEGY_NAME } from '../../../config/auth/native-authentication-strategy';
  13. import { ConfigService } from '../../../config/config.service';
  14. import { Logger } from '../../../config/logger/vendure-logger';
  15. import { AdministratorService } from '../../../service/services/administrator.service';
  16. import { ApiKeyService } from '../../../service/services/api-key.service';
  17. import { AuthService } from '../../../service/services/auth.service';
  18. import { UserService } from '../../../service/services/user.service';
  19. import { RequestContext } from '../../common/request-context';
  20. import { Allow } from '../../decorators/allow.decorator';
  21. import { Ctx } from '../../decorators/request-context.decorator';
  22. import { Transaction } from '../../decorators/transaction.decorator';
  23. import { BaseAuthResolver } from '../base/base-auth.resolver';
  24. @Resolver()
  25. export class AuthResolver extends BaseAuthResolver {
  26. constructor(
  27. authService: AuthService,
  28. userService: UserService,
  29. configService: ConfigService,
  30. administratorService: AdministratorService,
  31. apiKeyService: ApiKeyService,
  32. ) {
  33. super(authService, userService, administratorService, configService, apiKeyService);
  34. }
  35. @Transaction()
  36. @Mutation()
  37. @Allow(Permission.Public)
  38. async login(
  39. @Args() args: MutationLoginArgs,
  40. @Ctx() ctx: RequestContext,
  41. @Context('req') req: Request,
  42. @Context('res') res: Response,
  43. ): Promise<NativeAuthenticationResult> {
  44. const nativeAuthStrategyError = this.requireNativeAuthStrategy();
  45. if (nativeAuthStrategyError) {
  46. return nativeAuthStrategyError;
  47. }
  48. return (await super.baseLogin(args, ctx, req, res)) as AuthenticationResult;
  49. }
  50. @Transaction()
  51. @Mutation()
  52. @Allow(Permission.Public)
  53. async authenticate(
  54. @Args() args: MutationAuthenticateArgs,
  55. @Ctx() ctx: RequestContext,
  56. @Context('req') req: Request,
  57. @Context('res') res: Response,
  58. ): Promise<AuthenticationResult> {
  59. return (await this.authenticateAndCreateSession(ctx, args, req, res)) as AuthenticationResult;
  60. }
  61. @Transaction()
  62. @Mutation()
  63. @Allow(Permission.Public)
  64. logout(
  65. @Ctx() ctx: RequestContext,
  66. @Context('req') req: Request,
  67. @Context('res') res: Response,
  68. ): Promise<Success> {
  69. return super.logout(ctx, req, res);
  70. }
  71. @Query()
  72. @Allow(Permission.Authenticated, Permission.Owner)
  73. me(@Ctx() ctx: RequestContext) {
  74. return super.me(ctx, 'admin');
  75. }
  76. protected requireNativeAuthStrategy() {
  77. const { adminAuthenticationStrategy } = this.configService.authOptions;
  78. const nativeAuthStrategyIsConfigured = !!adminAuthenticationStrategy.find(
  79. strategy => strategy.name === NATIVE_AUTH_STRATEGY_NAME,
  80. );
  81. if (!nativeAuthStrategyIsConfigured) {
  82. const authStrategyNames = adminAuthenticationStrategy.map(s => s.name).join(', ');
  83. const errorMessage =
  84. 'This GraphQL operation requires that the NativeAuthenticationStrategy be configured for the Admin API.\n' +
  85. `Currently the following AuthenticationStrategies are enabled: ${authStrategyNames}`;
  86. Logger.error(errorMessage);
  87. return new NativeAuthStrategyError();
  88. }
  89. }
  90. }