问题描述
我使用 Angular 作为前端和 nestjs 作为后端开发了一个完整的堆栈应用程序。该项目组织在一个带有 NX 的单一存储库中。该项目在我的本地机器上运行良好,包括身份验证(来自 nestjs 的 Passport 库)。
所以我决定对应用程序进行 dockerize,但是当应用程序在 docker 容器中运行时,来自 nestjs 后端的受保护路由无法访问,尽管使用了我从同一个实例获得的 JWT 令牌,但我还是收到了 401 错误在 docker 容器中运行。
我将项目从 bcrypt 迁移到 bcryptjs,因为我在构建 docker 容器时遇到错误。最让我困惑的是,在我的本地机器上一切正常,但在 docker 容器中,尽管使用了我从后端获得的 JWT 令牌,但仍无法访问受保护的路由。
Dockerfile
FROM node:14
ENV PORT=3333
workdir /app
copY ["package.json","package-lock.json*","npm-shrinkwrap.json*","nx.json","./"]
RUN npm install
copY ./apps .
EXPOSE 3333
CMD npm start
docker-compose.yml
version: '3.4'
services:
myapp:
image: myapp
build:
context: .
dockerfile: ./Dockerfile
volumes:
- .:/app
depends_on:
- postgres
environment:
API_PORT: 3333
JWT_SECRET: verystrongsecret
JWT_EXPIRES_IN: 3600
DB_TYPE: postgres
DB_PORT: 5432
DB_HOST: postgres
DB_USERNAME: user
DB_PASSWORD: password
DB_NAME: db
NODE_ENV: development
TYPEORM_SYNC: 'true'
ports:
- 3333:3333
postgres:
image: postgres:10.4
ports:
- 5432:5432
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: db
如何解决认证问题?什么可能导致 docker 出现这种奇怪的行为?
JwtStrategy:
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(
@InjectRepository(UserRepository) private userRepository: UserRepository
) {
super({
jwtFromrequest: ExtractJwt.fromAuthHeaderAsBearerToken(),secretorKey: process.env.JWT_SECRET || config.get('jwt.secret'),});
}
async validate(payload: JwtPayload): Promise<User> {
const { email } = payload;
const user = await this.userRepository.findOne({ email });
if (!user) {
throw new UnauthorizedException();
}
return user;
}
}
为了保护我使用的路线:@UseGuards(AuthGuard())
其中 AuthGuard
来自护照图书馆。
AuthModule:
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),JwtModule.register({
secret: process.env.JWT_SECRET || jwtConfig.secret,signoptions: {
expiresIn: process.env.JWT_EXPIRES_IN || jwtConfig.expiresIn,},}),TypeOrmModule.forFeature([UserRepository]),],controllers: [AuthController],providers: [AuthService,JwtStrategy],exports: [AuthService,JwtStrategy,PassportModule],})
export class AuthModule {}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)