使用Node在服務端調用HTTP-Basic認證的API

前言

Node做爲先後端分離的」利器「因爲它使用JS語法的特殊性,可使得前端更好的利用Node來做爲中間層十分方便得調用後臺提供的「黑盒」API。即使是使用Node爲主做爲服務端開發在項目中也會常常用到要去其餘的系統調用服務的場景。前端

請求的認證一直是一個web系統很重要的一環,直接關係到了系統的安全。對於Node在服務端方面,稍微複雜的認證機制使用的最多的就是passport模塊,經過它強大而又靈活的Strategy機制,官方同時也提供了不少策略知足不少常見的場景。固然今天的主題是最簡單的基礎認證 HTTP Basic Authentication,提供了對http最爲基礎的認證策略,即用戶名和密碼。對於服務端調用API的場景加上這個基本認證也會比在前端直接使用這種比較「空」的更加合適。node

本文將介紹使用Node在服務端調用API時面對最基本的HTTP認證 -- HTTP Basic Authentication認證的處理方式。即不一樣的服務端http client諸如axios, request, restler的使用。ios

HTTP Basic Authentication

首先對HTTP Basic Authentication這個最簡單的http認證形式進行簡單介紹git

http-basic.jpg

上圖所示,在客戶端進行資源請求的時候因爲該接口API設置了http基本認證對資源的訪問進行了限制,則客戶端必須提供用戶名和密碼而且服務端驗證經過時纔會獲得資源。github

實現

下面將使用使用express搭建一個簡單的須要基本認證的接口,須要說明的是在express3中express還集成了很豐富的中間件系統,好比你能夠直接經過app.use(express.basicAuth('username', 'password'));來設置一個基本認證。在express4開始因爲分離了中間件系統,你須要多出一步手動安裝basic-auth中間件的過程。web

//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的服務器,當你執行node app.js以後訪問localhost:3000/api的時候就會看到瀏覽器彈出讓你輸入用戶名和密碼的對話框,你若是點擊了取消,即不提供用戶名和密碼,或者錯誤密碼,就會驗證失敗,你將看到‘go away’。當你提供了正確的密碼則將獲得'show me the gold'。express

值得一提的是,express的搭建中,我使用了body-parser這個中間件,緣由是接下來咱們使用node在服務端請求api的時候會使用POST方法傳遞參數,即我想獲得的是'show me the money'這句話。而http的post請求默認的數據格式是www-form-urlencoded解析的時候須要bodyParser.urlencoded支持。npm

在服務端調用API

其實在Node端能夠用的http client模塊有不少,好比可使用pipe進行流式操做的request,以及我如今在作的項目中使用的restler,固然還有如今很火爆的先後端均可以使用,而且基於現代異步基礎--Promiseaxios,接下來就介紹對於這三個模塊在服務端去請求一個設了HTTP Basic Authentication認證的API接口,就是從咱們上面用express搭起來的簡單的服務器獲得'show me the money'這句話。json

request模塊

npm install --save request安裝request模塊到咱們項目目錄,而後新建req.js文件。axios

//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方法,經過在第二個參數對象中寫上auth屬性提供對http基礎認證所須要的用戶名和密碼,第二個屬性form就是放在請求的body中的類型爲application/x-www-form-urlencoded參數,將會被咱們的express服務器經過req.body解析到,固然,須要bodyParser.urlencoded()提供支持。

接下來,先node app.js開啓咱們的服務器,以後你再去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,而且它的體積足夠的小,它對基礎認證的信息一樣也是在配置中的auth屬性,而他所須要隨請求放在body中的參數是放在data字段中,並且須要注意的是他返回的數據是在返回結果的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模塊,須要的認證信息直接是其第二個參數options中的兩個字段usernamepassword,攜帶在body中的信息依舊是放在data字段中,用監聽事件的方式監聽complete事件發生觸發回調函數你就獲得了經過驗證的消息{ key: 'you get the money' }

固然上述三個模塊以及瀏覽器發送請求不帶認證信息都將獲得帶着401的"go away",三個模塊不在請求的body中帶上參數need都會」show you the gold」。

後續

最後,若是有錯誤與不足還但願您能指出:)
完整demo地址
我的博客地址

相關文章
相關標籤/搜索