配置NbAuthJWTInterceptor以正确格式化JWT令牌时出现问题

时间:2019-07-10 12:56:22

标签: node.js authentication jwt ngx-admin

我正在为新应用程序使用ngx-admin。我已经利用Nebular Auth框架使用JWT令牌来启用对后端REST服务器的访问。

使用Postman测试API时,我可以通过使用标记JWT <token>格式化Authorization HTTP标头来成功认证和访问REST服务器。从我的基于ngx-admin的应用访问API的问题是NbAuthJWTInterceptor类以Bearer JWT <token>格式显示Authorization HTTP标头,因此我的后端API无法提取令牌。

如何配置或覆盖NbAuthJWTInterceptor类,以设置JWT <token>格式的Authorization HTTP标头?

在客户端,我正在使用:

  • ngx-admin 3.2.1
  • 角度7.2.1
  • nebular / auth 3.4.2

在服务器端,我将以下内容用于MongoDB:

  • 表达4.6.13
  • 护照0.4.0
  • passport-jwt 4.0.0
  • jsonwebtoken 8.5.1
  • 猫鼬5.1.7

我已经使用我已经成功使用Postman登录的令牌测试了对API的各种调用(GET,POST,PUT,DELETE),并将授权令牌格式化为JWT <token>,并且请求已被授权且正确数据已返回。

当我的应用提出相同的请求时,NbAuthJWTInterceptor类将Authorization令牌的格式设置为Bearer JWT <token>,因此该请求被拒绝为“未经授权”

在REST服务器端访问和解码授权令牌:

module.exports = function (passport) {
    var opts = {};
    opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('JWT');
    opts.secretOrKey = config.secret;

    passport.use(new JwtStrategy(opts, function (jwt_payload, done) {
        User.findOne({
            id: jwt_payload._id        
        }, function (err, user) {
            if (err) {
                return done(err, false);
            }
            if (user) {
                done(null, user);
            } else {
                done(null, false);
            }
        });
    }));
};

配置API端点和HTTP拦截器以在客户端上注入授权令牌:

@NgModule({
    declarations: [AppComponent],
    imports: [
        BrowserModule,
        BrowserAnimationsModule,
        HttpClientModule,
        AppRoutingModule,

        // NbEvaIconsModule,

        NgbModule.forRoot(),
        ThemeModule.forRoot(),
        CoreModule.forRoot(),

        NbAuthModule.forRoot({
            strategies: [
                NbPasswordAuthStrategy.setup({
                    name: 'email',
                    token: {
                        class: NbAuthJWTToken,
                        key: 'token',
                    },

                    baseEndpoint: '/api',
                    login: {
                        endpoint: '/auth/signin',
                        method: 'post',
                    },
                    register: {
                        endpoint: '/auth/signup',
                        method: 'post',
                    },
                    logout: {
                        endpoint: '/auth/sign-out',
                        method: 'post',
                    },
                    requestPass: {
                        endpoint: '/auth/request-pass',
                        method: 'post',
                    },
                    resetPass: {
                        endpoint: '/auth/reset-pass',
                        method: 'post',
                    },
                }),
            ],
            forms: {
                login: formDelaySetting,
                register: formDelaySetting,
                requestPassword: formSetting,
                resetPassword: formSetting,
                logout: {
                    redirectDelay: 0,
                },
            },
        }),

        NbThemeModule.forRoot({ name: 'corporate' }),

        NbToastrModule.forRoot(),

        NbLayoutModule,
    ],
    bootstrap: [AppComponent],
    providers: [
        { provide: APP_BASE_HREF, useValue: '/' }, 
        { provide: HTTP_INTERCEPTORS, useClass: NbAuthJWTInterceptor, multi: true },
        { provide: NB_AUTH_TOKEN_INTERCEPTOR_FILTER, useValue: (req) => { return false; } },
    ],
})

2 个答案:

答案 0 :(得分:0)

我最终仔细研究了所有Sub testPromo_Click() Dim strSQL As String Dim strDEPTCriteria As String Dim rs As DAO.Recordset strSQL = "PromoTable" Set rs = CurrentDb.OpenRecordset(strSQL) With rs If Not .BOF And Not .EOF Then .MoveFirst While (Not .EOF) DoCmd.OpenQuery "SelectedDepts" .MoveNext Wend End If .Close End With ExitSub: Set rs = Nothing Exit Sub End Sub 模块代码,并最终找到了罪魁祸首。 @Nebular/auth的Web令牌的“载体”部分已硬编码。因此,我必须克隆该类并进行制作,然后使用自己的HTTP拦截器:

NbAuthJWTInterceptor

答案 1 :(得分:0)

我使用的是nebular / auth 4.2.1,仍然有相同的问题,检查代码是否显示了一些文件夹:esm2015和esm5,有一些调用,但不清楚,在服务中仅此:

export declare class NbAuthJWTInterceptor implements HttpInterceptor {
    private injector;
    protected filter: any;
    constructor(injector: Injector, filter: any);
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>;
    protected readonly authService: NbAuthService;
}