登录控制器的 Loopback 4 身份验证问题
Loopback 4 authentication Issue with login controller
我正在尝试为我的应用程序添加身份验证。有两个名为用户和用户凭据的模型。用户有一个用户凭证。
对用户的 post 请求工作正常。密码存储在用户凭证模型中(散列),其他字段存储在用户模型中。
但是当我发出登录请求时出现以下错误
Unhandled error in POST /users/login: 500 TypeError:
this.userRepository.findCredentials is not a function
at MyUserService.verifyCredentials (D:\ionic-pr\loopback-projects\no\node_modules@loopback\authentication-jwt\src\services\user.service.ts:38:56)
at process._tickCallback (internal/process/next_tick.js:68:7)
节点模块中 authentication-jwt 内的用户服务抛出错误。
我不知道出了什么问题。
提前致谢
编辑: 现在我做了两个控制器。第一个使 post 请求工作正常。第二个执行登录如下
进口 -
import {TokenService} from '@loopback/authentication';
import {Credentials, MyUserService, TokenServiceBindings, UserRepository, UserServiceBindings} from "@loopback/authentication-jwt";
import {inject} from '@loopback/core';
import {repository} from '@loopback/repository';
import {post, requestBody} from '@loopback/rest';
import {SecurityBindings, UserProfile} from '@loopback/security';
构造函数-
constructor(
@inject(TokenServiceBindings.TOKEN_SERVICE)
public jwtService: TokenService,
@inject(UserServiceBindings.USER_SERVICE)
public userService: MyUserService,
@inject(SecurityBindings.USER, {optional: true})
public user: UserProfile,
@repository(UserRepository) protected userRepository: UserRepository,
)
正如您所说,您正在使用@ loopback/authenntication-jwt
import {User} from '../models';
import {UserRepository} from '../repositories';
从上面看来,您似乎已经创建了自己的用户存储库。您没有使用扩展中的默认值,这是抛出错误。
上面的导入应该像
import {
Credentials,
MyUserService,
TokenServiceBindings,
User,
UserRepository,
UserServiceBindings,
} from "@loopback/authentication-jwt";
这会解决你的问题。
如果您想创建自己的自定义用户,请参阅 https://github.com/strongloop/loopback-next/tree/master/extensions/authentication-jwt#customizing-user
您还导入了错误的 UserSerivce。它应该来自@loopback/authentication-jwt
你的注射应该像
@inject(UserServiceBindings.USER_SERVICE) public userService: MyUserService,
如果有人有类似的问题,并且上面的解决方案已经是您的解决方案,则可能只是与您的代码中定义的 UserRepository
存在冲突。
确实 UserServiceBindings.USER_SERVICE
将加载一个 UserRepository
。如果您在项目中定义了 UserRepository
class,这可能会产生冲突并使注入注入您的 UserRepository
而不是来自 authentication-jwt
的注入。您可以通过记录 this.userRepository
.
来查看
解决方案很简单:将本地 UserRepository
class 重命名为其他名称。
Note : this does not seem to be an issue with a custom User
class.
我正在尝试为我的应用程序添加身份验证。有两个名为用户和用户凭据的模型。用户有一个用户凭证。
对用户的 post 请求工作正常。密码存储在用户凭证模型中(散列),其他字段存储在用户模型中。
但是当我发出登录请求时出现以下错误
Unhandled error in POST /users/login: 500 TypeError: this.userRepository.findCredentials is not a function at MyUserService.verifyCredentials (D:\ionic-pr\loopback-projects\no\node_modules@loopback\authentication-jwt\src\services\user.service.ts:38:56) at process._tickCallback (internal/process/next_tick.js:68:7)
节点模块中 authentication-jwt 内的用户服务抛出错误。
我不知道出了什么问题。
提前致谢
编辑: 现在我做了两个控制器。第一个使 post 请求工作正常。第二个执行登录如下
进口 -
import {TokenService} from '@loopback/authentication';
import {Credentials, MyUserService, TokenServiceBindings, UserRepository, UserServiceBindings} from "@loopback/authentication-jwt";
import {inject} from '@loopback/core';
import {repository} from '@loopback/repository';
import {post, requestBody} from '@loopback/rest';
import {SecurityBindings, UserProfile} from '@loopback/security';
构造函数-
constructor(
@inject(TokenServiceBindings.TOKEN_SERVICE)
public jwtService: TokenService,
@inject(UserServiceBindings.USER_SERVICE)
public userService: MyUserService,
@inject(SecurityBindings.USER, {optional: true})
public user: UserProfile,
@repository(UserRepository) protected userRepository: UserRepository,
)
正如您所说,您正在使用@ loopback/authenntication-jwt
import {User} from '../models';
import {UserRepository} from '../repositories';
从上面看来,您似乎已经创建了自己的用户存储库。您没有使用扩展中的默认值,这是抛出错误。 上面的导入应该像
import {
Credentials,
MyUserService,
TokenServiceBindings,
User,
UserRepository,
UserServiceBindings,
} from "@loopback/authentication-jwt";
这会解决你的问题。 如果您想创建自己的自定义用户,请参阅 https://github.com/strongloop/loopback-next/tree/master/extensions/authentication-jwt#customizing-user 您还导入了错误的 UserSerivce。它应该来自@loopback/authentication-jwt 你的注射应该像
@inject(UserServiceBindings.USER_SERVICE) public userService: MyUserService,
如果有人有类似的问题,并且上面的解决方案已经是您的解决方案,则可能只是与您的代码中定义的 UserRepository
存在冲突。
确实 UserServiceBindings.USER_SERVICE
将加载一个 UserRepository
。如果您在项目中定义了 UserRepository
class,这可能会产生冲突并使注入注入您的 UserRepository
而不是来自 authentication-jwt
的注入。您可以通过记录 this.userRepository
.
解决方案很简单:将本地 UserRepository
class 重命名为其他名称。
Note : this does not seem to be an issue with a custom
User
class.