摘要:認(rèn)證在非節(jié)點(diǎn)完成。你已經(jīng)有一個(gè)或者節(jié)點(diǎn),只有認(rèn)證成功的用戶可以訪問(wèn),添加非常的簡(jiǎn)單。第三種情況一般是一個(gè)全新的后端會(huì)有的形態(tài),盡量避免處理非節(jié)點(diǎn)。非節(jié)點(diǎn)的處理機(jī)制非節(jié)點(diǎn),我是指和,或者基本認(rèn)證。上面的也可以和非節(jié)點(diǎn)的認(rèn)證方法一起使用。
GraphQL與認(rèn)證
很多人會(huì)問(wèn)GraphQL怎么認(rèn)證和授權(quán)。最終的答案是GraphQL只是一個(gè)查詢語(yǔ)言和認(rèn)證之類的沒(méi)什么關(guān)系,每一個(gè)應(yīng)用都可以有自己的實(shí)現(xiàn)方法。但是,我們還是來(lái)深入聊聊這個(gè)問(wèn)題。
大局上看基本上,有三種情況會(huì)發(fā)生:
已經(jīng)登錄的用戶發(fā)出GraphQL查詢,未登錄的用戶不可以。認(rèn)證在非GraphQL節(jié)點(diǎn)完成。
所有用戶都可以發(fā)出GraphQL查詢,未登錄用戶可以使用其中的一個(gè)子集。認(rèn)證在非GraphQL節(jié)點(diǎn)完成。
所有用戶都可以發(fā)出GraphQL查詢,認(rèn)證就由GraphQL節(jié)點(diǎn)完成。
第一種情況可能是普遍存在的。你已經(jīng)有一個(gè)REST或者RPC節(jié)點(diǎn),只有認(rèn)證成功的用戶可以訪問(wèn),添加/graphql非常的簡(jiǎn)單。不好的地方是,你的客戶端不得不處理GraphQL和非GraphQL兩種情況。這可能是一筆技術(shù)債。
第二種情況是第一種項(xiàng)目進(jìn)化以后的結(jié)果。最終前端代碼只使用GraphQL,只不過(guò)久經(jīng)考驗(yàn)的認(rèn)證節(jié)點(diǎn)還會(huì)留著。
第三種情況一般是一個(gè)全新的后端會(huì)有的形態(tài),盡量避免處理非GraphQL節(jié)點(diǎn)。我(作者)還沒(méi)有見(jiàn)過(guò)這樣形態(tài)的服務(wù)端。
非GraphQL節(jié)點(diǎn)的處理機(jī)制非GraphQL節(jié)點(diǎn),我是指cookies、JSON和web tokens,或者HTTP基本認(rèn)證。基本上無(wú)論何種方式,你的server都可以通過(guò)認(rèn)證一個(gè)用戶、一個(gè)請(qǐng)求并最終把數(shù)據(jù)傳輸給你的resolver。
這里是一個(gè)使用express-graphql和cookies是例子(從他們的例子里結(jié)果來(lái)的):
var session = require("express-session"); var graphqlHTTP = require("express-graphql"); var MySchema = require("./MySchema"); var app = express(); app.use(session({ secret: "secret", cookie: { maxAge: 60000 }})); app.use("/graphql", graphqlHTTP((request) => ({ schema: MySchema, rootValue: { session: request.session }, graphiql: truem })));
在express里,請(qǐng)求在一個(gè)比GraphQL路由更早的中間件處理了。之后,請(qǐng)求才會(huì)到達(dá)GraphQL代碼。我們知道請(qǐng)求是從哪里來(lái)的。我們甚至都可以在請(qǐng)求到達(dá)GraphQL代碼以前,把請(qǐng)求重定向到登錄頁(yè)面。
下面的例子使用了express-session,但是處理的原則和express-jwt差不多。在GraphQL層面上,你的schema代碼會(huì)是這樣的:
new GraphQLObjectType({ name: "Secrets", fields: { bigSecret: { type: GraphQLString, resolve(parentValue, _, { rootValue: { session } }) { return getBigSecret(session); } } } });
只要能取到session,那么用戶就可以訪問(wèn)其他相關(guān)的資源了。或者,如果session不存在,那么你按照你的設(shè)計(jì)拋出錯(cuò)誤或者實(shí)現(xiàn)其他的處理。
關(guān)鍵是rootValue并沒(méi)有在我們的GraphQL模式中定義為一個(gè)公開(kāi)的字段或者參數(shù),我們不信任客戶端直接發(fā)送過(guò)來(lái)的數(shù)據(jù),所以它是由server的其他代碼注入的。
使用GraphQL時(shí)的實(shí)現(xiàn)機(jī)制但是我們要完全的使用GraphQL呢?以上的方法可以在使用了express-graphql的時(shí)候使用。但是無(wú)法遷移到其他的實(shí)現(xiàn)里。
在少數(shù)的例子里,F(xiàn)acebook談到了 concept of a viewer field。主要的思想是你的應(yīng)用的數(shù)據(jù)和誰(shuí)訪問(wèn)相關(guān),所以全部的其他字段的數(shù)據(jù)都嵌入到里面。實(shí)際情況是,不可能所有的數(shù)據(jù)都和訪問(wèn)者相關(guān)。但是這么做的話,你可以有改變的余地。
{ viewer { name friends { name } getProfile(id: String!) { name } } }
注意即使和訪問(wèn)者無(wú)關(guān)的getProfile字段也放在了viewer字段里,為了以防萬(wàn)一哪天要限制訪問(wèn)者可以訪問(wèn)的數(shù)據(jù)的時(shí)候處理起來(lái)就簡(jiǎn)單了。
一個(gè)像Facebook一樣的APP為了保護(hù)隱私,有很多什么人可以查看什么數(shù)據(jù)的邏輯處理。即使是一個(gè)簡(jiǎn)單的APP也不會(huì)讓用戶查看他沒(méi)有創(chuàng)建的數(shù)據(jù)。一個(gè)常用的方法是修改URL里的userID來(lái)查看一些私有數(shù)據(jù),如果server不檢查用戶所有權(quán)的話。使用一個(gè)單一的viewer字段就讓所有權(quán)檢查簡(jiǎn)單了很多。
上面的schema也可以和非GraphQL節(jié)點(diǎn)的認(rèn)證方法一起使用。但是如果我們這么干的話呢:
{ viewer(token: String) { name } }
如果不是用header或者查詢參數(shù)(比如:JWT、OAuth、等),我們可以把它放在GraphQL的查詢里。你的schema的代碼可以使用JWT庫(kù)等工具直接解析傳過(guò)來(lái)的token。
**注意**:永遠(yuǎn)使用HTTPS來(lái)傳輸敏感數(shù)據(jù)。
要發(fā)出新的token,mutation就可以使用了:
mutation { createToken(username: String!, password: String!) { token error } }
我們可以認(rèn)證放在mutation里,要么返回一個(gè)token要么返回一個(gè)錯(cuò)誤。這樣前端就可以把token存起來(lái)在之后的請(qǐng)求里使用了。
譯自:https://medium.com/the-graphq...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86743.html
摘要:需要哪些數(shù)據(jù),與開(kāi)發(fā)人員在中聲明該數(shù)據(jù)的方式之間存在緊密的聯(lián)系。該大致表示了層可以響應(yīng)的范圍。為了解決多次往返的問(wèn)題,讓響應(yīng)服務(wù)器只是作為一個(gè)端點(diǎn)。它需要一種語(yǔ)言來(lái)處理自定義請(qǐng)求,并響應(yīng)該自定義請(qǐng)求的數(shù)據(jù)。一旦安裝,移動(dòng)應(yīng)用可能會(huì)持續(xù)使用同 首發(fā)于眾成翻譯 即使與 REST API 打交道這么多年,當(dāng)我第一次了解到 GraphQL 和它試圖解決的問(wèn)題時(shí),我還是禁不住把本文的標(biāo)題發(fā)在了...
摘要:前言兩篇文章學(xué)完了基礎(chǔ)篇原理篇,接下去便是實(shí)踐的過(guò)程,這個(gè)實(shí)踐我們使用了如下技術(shù)棧去實(shí)現(xiàn)一套任務(wù)管理系統(tǒng),源碼就不公開(kāi)了等穩(wěn)定后再發(fā)布。后續(xù)我所在的公司網(wǎng)關(guān)團(tuán)隊(duì)會(huì)持續(xù)實(shí)踐,爭(zhēng)取貢獻(xiàn)出更多的解決方案。前言 兩篇文章學(xué)完了GraphQL(基礎(chǔ)篇, 原理篇),接下去便是實(shí)踐的過(guò)程,這個(gè)實(shí)踐我們使用了如下技術(shù)棧去實(shí)現(xiàn)一套任務(wù)管理系統(tǒng),源碼就不公開(kāi)了, 等穩(wěn)定后再發(fā)布。效果如下: showImg(ht...
摘要:對(duì)于每個(gè)案例,我們插入所需要的測(cè)試數(shù)據(jù),調(diào)用需要測(cè)試的函數(shù)并對(duì)結(jié)果作出斷言。我們將這個(gè)套接字和用戶返回以供我們其他的測(cè)試使用。 原文地址:Elixir, Phoenix, Absinthe, GraphQL, React, and Apollo: an absurdly deep dive - Part 2 原文作者:Zach Schneider 譯文出自:掘金翻譯計(jì)劃 本文永久鏈接:gi...
摘要:要對(duì)進(jìn)行黑盒測(cè)試測(cè)試的最好辦法是對(duì)他們進(jìn)行黑盒測(cè)試,黑盒測(cè)試是一種不關(guān)心應(yīng)用內(nèi)部結(jié)構(gòu)和工作原理的測(cè)試方法,測(cè)試時(shí)系統(tǒng)任何部分都不應(yīng)該被。此外,有了黑盒測(cè)試并不意味著不需要單元測(cè)試,針對(duì)的單元測(cè)試還是需要編寫的。 本文首發(fā)于之乎專欄前端周刊,全文共 6953 字,讀完需 8 分鐘,速度需 2 分鐘。翻譯自:RingStack 的文章 https://blog.risingstack.co...
摘要:最終代碼省略其他輸入類型用標(biāo)識(shí)查詢類型需要至少定義一個(gè)不要會(huì)不顯示查詢這里需要轉(zhuǎn)成數(shù)組因?yàn)榍懊娑x了返回值是類型相當(dāng)于數(shù)據(jù)庫(kù)的添加操作相當(dāng)于數(shù)據(jù)庫(kù)的更新操作省略其他現(xiàn)在我們可以啟動(dòng)服務(wù)器,在上測(cè)試下效果了。 showImg(https://segmentfault.com/img/remote/1460000019142304?w=893&h=438); 看完復(fù)聯(lián)四,我整理了這份 Gr...
閱讀 2645·2021-10-12 10:12
閱讀 790·2019-08-29 17:25
閱讀 2792·2019-08-29 17:24
閱讀 3226·2019-08-29 17:19
閱讀 1806·2019-08-29 15:39
閱讀 3053·2019-08-26 16:50
閱讀 1997·2019-08-26 12:17
閱讀 2703·2019-08-26 12:16