成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

GraphQL與認(rèn)證

aristark / 3194人閱讀

摘要:認(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

相關(guān)文章

  • 安息吧 REST API,GraphQL 長(zhǎng)存

    摘要:需要哪些數(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ā)在了...

    Big_fat_cat 評(píng)論0 收藏0
  • GraphQL學(xué)習(xí)之實(shí)踐篇

    摘要:前言兩篇文章學(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...

    Drinkey 評(píng)論0 收藏0
  • [譯] Elixir、Phoenix、Absinthe、GraphQL、React 和 Apollo

    摘要:對(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...

    Cympros 評(píng)論0 收藏0
  • 編寫 Node.js Rest API 的 10 個(gè)最佳實(shí)踐

    摘要:要對(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...

    ermaoL 評(píng)論0 收藏0
  • 【CuteJavaScript】GraphQL真香入門教程

    摘要:最終代碼省略其他輸入類型用標(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...

    bingo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<