使用Node在服務(wù)端調(diào)用HTTP-Basic認(rèn)證的API

前言

Node作為前后端分離的”利器“由于它使用JS語法的特殊性撩银,可以使得前端更好的利用Node來作為中間層十分方便得調(diào)用后臺提供的“黑盒”API。即便是使用Node為主作為服務(wù)端開發(fā)在項目中也會經(jīng)常用到要去其他的系統(tǒng)調(diào)用服務(wù)的場景。

請求的認(rèn)證一直是一個web系統(tǒng)很重要的一環(huán),直接關(guān)系到了系統(tǒng)的安全碰逸。對于Node在服務(wù)端方面削祈,稍微復(fù)雜的認(rèn)證機(jī)制使用的最多的就是passport模塊饰抒,通過它強大而又靈活的Strategy機(jī)制肮砾,官方同時也提供了很多策略滿足很多常見的場景。當(dāng)然今天的主題是最簡單的基礎(chǔ)認(rèn)證 HTTP Basic Authentication袋坑,提供了對http最為基礎(chǔ)的認(rèn)證策略仗处,即用戶名和密碼。對于服務(wù)端調(diào)用API的場景加上這個基本認(rèn)證也會比在前端直接使用這種比較“空”的更加合適枣宫。

本文將介紹使用Node在服務(wù)端調(diào)用API時面對最基本的HTTP認(rèn)證 -- HTTP Basic Authentication認(rèn)證的處理方式婆誓。即不同的服務(wù)端http client諸如axios, request, restler的使用。

HTTP Basic Authentication

首先對HTTP Basic Authentication這個最簡單的http認(rèn)證形式進(jìn)行簡單介紹

http-basic.jpg

上圖所示也颤,在客戶端進(jìn)行資源請求的時候由于該接口API設(shè)置了http基本認(rèn)證對資源的訪問進(jìn)行了限制洋幻,則客戶端必須提供用戶名和密碼并且服務(wù)端驗證通過時才會得到資源。

實現(xiàn)

下面將使用使用express搭建一個簡單的需要基本認(rèn)證的接口翅娶,需要說明的是在express3中express還集成了很豐富的中間件系統(tǒng)鞋屈,比如你可以直接通過app.use(express.basicAuth('username', 'password'));來設(shè)置一個基本認(rèn)證。在express4開始由于分離了中間件系統(tǒng),你需要多出一步手動安裝basic-auth中間件的過程故觅。

//app.js
const express = require('express')
const basicAuth = require('basic-auth')
const bodyParser = require('body-parser')
const app = express();
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({
    extended:true
   }))
app.all('/api', function (req, res) {
    const credentials = basicAuth(req)
    if (!credentials || credentials.name !== 'ray' || credentials.pass !== '123') {
        res.statusCode = 401
        res.setHeader('WWW-Authenticate', 'Basic realm="example"')
        res.end('go away')
    } else {
        console.log(req.body)
        if(req.body.need && req.body.need === 'money'){
            res.json({
                key: 'show me the money'
            });
        }else{
            res.json({
                key: 'show me the gold'
            })  
        }            
    }
});

app.listen(3000, function () {
    console.log('Example app listening on port 3000!');
});

先簡單的搭建起一個提供api的服務(wù)器厂庇,當(dāng)你執(zhí)行node app.js之后訪問localhost:3000/api的時候就會看到瀏覽器彈出讓你輸入用戶名和密碼的對話框,你如果點擊了取消输吏,即不提供用戶名和密碼权旷,或者錯誤密碼,就會驗證失敗贯溅,你將看到‘go away’拄氯。當(dāng)你提供了正確的密碼則將得到'show me the gold'。

值得一提的是它浅,express的搭建中,我使用了body-parser這個中間件译柏,原因是接下來我們使用node在服務(wù)端請求api的時候會使用POST方法傳遞參數(shù),即我想得到的是'show me the money'這句話姐霍。而http的post請求默認(rèn)的數(shù)據(jù)格式是www-form-urlencoded解析的時候需要bodyParser.urlencoded支持鄙麦。

在服務(wù)端調(diào)用API

其實在Node端可以用的http client模塊有很多,比如可以使用pipe進(jìn)行流式操作的request,以及我現(xiàn)在在做的項目中使用的restler,當(dāng)然還有現(xiàn)在很火爆的前后端都可以使用镊折,并且基于現(xiàn)代異步基礎(chǔ)--Promiseaxios,接下來就介紹對于這三個模塊在服務(wù)端去請求一個設(shè)了HTTP Basic Authentication認(rèn)證的API接口胯府,就是從我們上面用express搭起來的簡單的服務(wù)器得到'show me the money'這句話。

request模塊

npm install --save request安裝request模塊到我們項目目錄恨胚,然后新建req.js文件骂因。

//req.js
const request = require('request')

request.post('http://localhost:3000/api', {
    'auth': {
        'user': 'ray',
        'pass': '123',
        'sendImmediately': false
    },
    'form': {
        need: 'money'
    }
}, function (err, httpResponse, data) {
    if (err) {
        console.log(err);
    } else {
        console.log(`data:${data}`)
    }
})

request模塊本身體積確實有點大,上面使用它的post方法赃泡,通過在第二個參數(shù)對象中寫上auth屬性提供對http基礎(chǔ)認(rèn)證所需要的用戶名和密碼寒波,第二個屬性form就是放在請求的body中的類型為application/x-www-form-urlencoded參數(shù)乘盼,將會被我們的express服務(wù)器通過req.body解析到,當(dāng)然俄烁,需要bodyParser.urlencoded()提供支持蹦肴。

接下來,先node app.js開啟我們的服務(wù)器猴娩,之后你再去node req.js運行這個文件你就會看到data:{"key":"you get the money"}

axios模塊

npm install --save axios,新建axi.js

//axi.js
const axios = require('axios')

axios({
        url: 'http://localhost:3000/api',
        method: 'post',
        auth: {
            username: 'ray',
            password: '123'
        },
        data: {
            need: 'money'
        }
    })
    .then((response) => {
        console.log(response.data)
    })
    .catch(function (error) {
        console.log(error);
      });

axios最大的特點就是可以十分愉快的使用Promise,并且它的體積足夠的小勺阐,它對基礎(chǔ)認(rèn)證的信息同樣也是在配置中的auth屬性卷中,而他所需要隨請求放在body中的參數(shù)是放在data字段中,而且需要注意的是他返回的數(shù)據(jù)是在返回結(jié)果的data字段中渊抽,同樣蟆豫,此時你node axi.js也能得到{ key: 'you get the money' }.

restler模塊

npm install --save restler,新建rest.js

const rest = require('restler')

rest.post('http://localhost:3000/api',{
    username:'ray',
    password:'123',
    data: {
        need:'money'
    }
}).on('complete',function(data){
    console.log(data)
})

最后是restler模塊,需要的認(rèn)證信息直接是其第二個參數(shù)options中的兩個字段usernamepassword,攜帶在body中的信息依舊是放在data字段中,用監(jiān)聽事件的方式監(jiān)聽complete事件發(fā)生觸發(fā)回調(diào)函數(shù)你就得到了通過驗證的消息{ key: 'you get the money' }懒闷。

當(dāng)然上述三個模塊以及瀏覽器發(fā)送請求不帶認(rèn)證信息都將得到帶著401的"go away",三個模塊不在請求的body中帶上參數(shù)need都會”show you the gold”十减。

后續(xù)

最后,如果有錯誤與不足還希望您能指出:)
完整demo地址
個人博客地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愤估,一起剝皮案震驚了整個濱河市帮辟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玩焰,老刑警劉巖由驹,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昔园,居然都是意外死亡蔓榄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門默刚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甥郑,“玉大人,你說我怎么就攤上這事荤西±浇粒” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵邪锌,是天一觀的道長店展。 經(jīng)常有香客問我,道長秃流,這世上最難降的妖魔是什么赂蕴? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮舶胀,結(jié)果婚禮上概说,老公的妹妹穿的比我還像新娘碧注。我一直安慰自己,他們只是感情好糖赔,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布萍丐。 她就那樣靜靜地躺著,像睡著了一般放典。 火紅的嫁衣襯著肌膚如雪逝变。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天奋构,我揣著相機(jī)與錄音壳影,去河邊找鬼。 笑死弥臼,一個胖子當(dāng)著我的面吹牛宴咧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播径缅,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼掺栅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纳猪?” 一聲冷哼從身側(cè)響起氧卧,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氏堤,沒想到半個月后假抄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡丽猬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年宿饱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脚祟。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡谬以,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出由桌,到底是詐尸還是另有隱情为黎,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布行您,位于F島的核電站铭乾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏娃循。R本人自食惡果不足惜炕檩,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笛质,春花似錦泉沾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至敲霍,卻和暖如春俊马,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肩杈。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工柴我, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锋恬。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像编丘,于是被迫代替她去往敵國和親与学。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 很多Node.js初學(xué)者都會有這樣的疑惑嘉抓,Node.js到底是單線程的還是多線程的索守?通過本章的學(xué)習(xí),能夠讓讀者較為...
    越努力越幸運_952c閱讀 3,632評論 4 36
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理抑片,服務(wù)發(fā)現(xiàn)卵佛,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 睡著的城開燈 醒著的星失明 在迢迢杳杳的村落 提著彎月枯坐黎明 水波托起黯淡的光陰 風(fēng)聲亂了煙草的氤氳 潑云樹縹緲...
    晚樹閱讀 401評論 20 25
  • 我是八寶呀閱讀 168評論 0 0