不知道爲什麼這個問題downvoted,也許是因爲它應該是兩個單獨的問題。
您可以擴展Express的類型聲明。
擴展快遞類型定義
添加文件library-ext.d.ts
與此源目錄。
declare module 'express' {
export interface Request {
user?: any;
}
}
對於req.header.authorization
請嘗試:req.headers ['authorization']。注意's'。
與一般認證
這取決於你是否註冊的用戶也可以使用guest
路線。如果您永遠不需要客人路線上的身份,那麼只需在經過認證的路線上註冊護照認證中間件,或者將路線拆分爲單獨的路由器。這很簡單,只需搜索堆棧溢出或查看文檔即可。
更復雜的情況是,當您需要經過身份驗證的用戶和未經身份驗證的用戶都可以訪問路線時 - 請考慮客人或經過身份驗證的客戶將某物添加到購物車。不幸的是passport-jwt
當令牌不在授權標題中時拒絕401,所以我發現最簡單的方式,而不是分支項目或者滾動我自己的策略,就是使用中間件添加一個已知值來表示匿名請求。然後確保中間件在受影響路由中的護照認證之前。這裏有一個片斷,讓你去:
CoreCtrl
class CoreCtrl {
simulateAnonymous(req, res, next) {
if (!req.headers.authorization) {
req.headers.authorization = 'Bearer guest-token';
}
return next();
}
}
然後在某處你快速安裝
setupRouters() {
// the public and admin routers are bound to the application
const coreCtrl = new CoreCtrl(this.serverOpts);
const anonymousCtrl = coreCtrl.simulateAnonymous.bind(coreCtrl);
this.routers.admin.use(anonymousCtrl);
this.routers.admin.use(passport.authenticate('UserBearer', { session: false }));
this.routers.public.use(anonymousCtrl);
this.routers.public.use(passport.authenticate('CustomerBearer', { session: false }));
}
請注意,我有獨立的路由器爲公共和管理設在這裏,這不是必要的,只是爲了說明如何去做。
然後在承載策略中,你會得到一些類似於這個的代碼。
/**
* Run the strategy
*
* @param token {String} The JWT Token
* @param done {Callback} Callback function
*/
exec(token:string, done):Promise<any> {
// this is the workaround to support not passing a token for guest users.
if (token === 'guest-token') {
return done(null, {
userId: 'guest',
roles: ['guest']
});
}
// otherwise decode the token and find the user.
}
最後,在稍後的一些中間件中,您可以檢查'guest'角色是否可以訪問受保護的資源。我建議使用acl
模塊來管理基於角色的ACL列表。
運行此代碼時您是否收到錯誤消息,或者您的問題是關於intellisense的問題? Javascript不容易靜態分析,所以intellisense有很多東西無法提取 –
它正在變成紅色的intellisense,當我mouseover我得到「未解決的變量用戶」。我認爲,因爲我使用打字稿,它會找到變量。 – user1790300
我不認爲intellisense會變得聰明,對不起讓人失望。這一切仍然是新的,有些部分仍然未知。部分與新技術合作:) –