我正在为新应用程序使用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标头?
在客户端,我正在使用:
在服务器端,我将以下内容用于MongoDB:
我已经使用我已经成功使用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; } },
],
})
答案 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;
}