簡體   English   中英

使用GraphQL與JWT進行身份驗證

[英]Authentication with JWT using GraphQL

在網上搜索后,我發現使用GraphQL時最好的JWT身份驗證方法是將JWT令牌插入GraphQL上下文中。 這樣,解析程序可以訪問它,並檢查用戶是否已登錄,是否具有權限等。

我想知道是否需要將身份驗證邏輯/功能放入需要身份驗證的每個解析器中。 除了登錄/注銷/注冊/忘記密碼之外,是否可以默認設置對每個查詢的身份驗證(例如中間件)?

這個問題經常出現,但是討論的不夠多。 我認為答案不在於技術,而在於最適合您需求的方式。

在采用GraphQL時要特別注意;

  • 您不必放棄REST
  • 您可以有多個 GraphQL端點

以下是根據我實施GraphQL的經驗提出的一些建議

認證

對於登錄/注銷/忘記密碼以及整個密碼,請考慮過時。 表單發布+服務器端渲染,REST API為我們服務了數十年。 許多第三方身份驗證服務都基於此(Facebook登錄,Google,OAuth2 ...等)。 我傾向於避免為此目的使用GraphQL。

授權

檢查請求者是否被授權訪問GraphQL的邏輯可以概括為2個級別

GraphQL服務

本質上,您檢查以查看請求者是否被授權使用GraphQL服務。 通常,更容易檢查請求者是否已通過身份驗證,否則將完全拒絕對服務的訪問。 通常,這是通過Web服務器中間件完成的。

有時候,您需要向匿名用戶公開一些GraphQL查詢,而我傾向於傾向於使用另一個“不受限制的” GraphQL端點。 該端點趨於幾乎沒有突變,只暴露了有限的信息子集和受限的嵌套查詢。

基本上,您查看數據並確定哪些信息/操作是公開的,哪些不是公開的。 與單個GraphQL端點和在每個查詢路徑/解析器中實現授權檢查點相比,IMO更加易於管理和保護。

細糧授權

基本上,在此階段,所有請求者都是經過身份驗證的用戶。 我們可能需要質疑:

  • 請求者是當前查看其信息的同一用戶嗎?
  • 請求者是當前查看其信息的用戶的朋友嗎?
  • 請求者是當前正在查看其信息的公司的成員嗎?

這就是將檢查邏輯放入解析器(或模型)的真正意義所在。 我個人認為解析器是執行此操作的好地方。 DataLoader結合使用,實現仍然可以快速有效。

希望這可以幫助!

無需在解析器中進行檢查。 您可以在服務器端添加中間件。

 const graphQLServer = express(); graphQLServer.use('/graphql', function(req, res, next) { var token = req.headers.token; if (token != null && token != 'undefined') { //Do token verification here next(); } else { // if there is no token // return an error return res.status(403).send({ success: false, message: 'No token provided.' }); } }) 

試試這個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM