2017-05-15 83 views
1

我目前正在使用typescript,WebStorm,passport和jwt的node.js microservices應用程序的身份驗證服務。在嘗試將路由添加到「/ api/login」時,我注意到intellisense似乎沒有拿起req.user的用戶對象或req.header.authorization的授權對象。例如,下面的方法是行不通的,因爲它無法找到用戶對象:使用passport和typescript的Node.js身份驗證:找不到req.user

private generateToken(req: Request, res: Response, next: NextFunction){ 
req.token = jwt.sign({ 
    id: req.user.id, 
    firstname: req.user.firstname, 
    lastname: req.user.lastname, 
    roles: req.user.roles 
}, process.env.AUTH_KEY, { 
    expiresIn: "7d" 
}); 
return next(); 
} 

我使用從快遞Request對象:

import { NextFunction, Request, Response, Router } from "express"; 

我需要使用不同的Request對象?

此外,如果我需要強制認證到某些api路由,但鎖定其他路由,應如何使用passport-jwt完成此操作?我知道有一個快遞 - 除非可以用於express-jwt。

+0

運行此代碼時您是否收到錯誤消息,或者您的問題是關於intellisense的問題? Javascript不容易靜態分析,所以intellisense有很多東西無法提取 –

+0

它正在變成紅色的intellisense,當我mouseover我得到「未解決的變量用戶」。我認爲,因爲我使用打字稿,它會找到變量。 – user1790300

+0

我不認爲intellisense會變得聰明,對不起讓人失望。這一切仍然是新的,有些部分仍然未知。部分與新技術合作:) –

回答

1

不知道爲什麼這個問題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列表。

相關問題