細緻想想。我們的後台系統還沒有乙個登入功能,太不靠譜,趕緊把防盜門安上!
spa的鑑權方式和傳統的web應用不同:因為頁面的渲染不再依賴服務端,與服務端的互動都通過介面來完畢,而reastful風格的介面提倡無狀態(state less)。通常不使用cookie和session來進行身份認證。
比較流行的一種方式是使用web token,所謂的token能夠看作是乙個標識身份的令牌。
client在登入成功後能夠獲得服務端加密後的token,然後在興許須要身份認證的介面請求中在header中帶上這個token。服務端就能夠通過推斷token的有效性來驗證該請求是否合法。
我們先來改造一下服務端。實現乙個簡單的基於token的身份認證(可直接複製**。無需關心詳細實現)。
先在根資料夾下執行npm i json-server -d
,儘管一開始以全域性的方式安裝過json-server這個工具。但本次要在**中使用json-server的api,須要將其安裝為專案依賴。
然後新建/server/auth.js
檔案,寫入下面**:
const expiretime = 1000 * 60;
module.exports = function
(req, res, next)
} if (unauthorized) else
};
新建/server/index.js
檔案,寫入下面**:
const path = require('path');
const jsonserver = require('json-server');
const server = jsonserver.create();
const router = jsonserver.router(path.join(__dirname, 'db.json'));
const middlewares = jsonserver.defaults();
server.use(jsonserver.bodyparser);
server.use(middlewares);
server.post('/login', function
(req, res, next) = req.body;
if (account === 'admin' && password === '123456') else
});server.use(require('./auth'));
server.use(router);
server.listen(3000, function
() );
改動/package.json
檔案裡的scripts.server
:
,
...}
然後使用npm run server
重新啟動伺服器。
如今我們的伺服器就擁有了身份認證的功能,訪問除了』/login』外的其他介面時。服務端會依據請求的header中access-token來推斷請求是否有效,假設無效則會返回401狀態碼。
當client收到401的狀態碼時。須要跳轉到登入頁面進行登入。有效的管理員賬號為admin。密碼為123456。
以post方法提交下面的引數到』http://localhost:3000/login『介面,就能夠完畢登入。
登入成功後。介面返回true
,而且在返回的headers中包括了乙個有效的access-token,用於在後面的請求中使用;登入失敗則返回false
。
access-token的有效期為1分鐘,每次有效的介面請求都會獲得新的access-token;若1分鐘內沒有做操作,則會過期須要又一次登入。
我們的access-token僅僅是乙個簡單的timestamp,且沒有做不論什麼加密措施。
因為我們每乙個介面的請求都須要加上乙個名為access-token的header,在每次須要呼叫介面的時候都寫一遍就很的不明智了,所以我們須要封裝fetch方法。
新建/src/utils/request.js
。寫入下面**:
import from 'react-router';
export default
function
request
(method, url, body) else
return fetch(url, ,
body
}).then((res) => else
return res.json();
}});
}export const get = url => request('get', url);
export const post = (url, body) => request('post', url, body);
export const put = (url, body) => request('put', url, body);
export const del = (url, body) => request('delete', url, body);
request方法封裝了加入access-token頭等邏輯,然後就能夠在須要呼叫介面的時候使用request或get、post等方法了,比方/src/components/bookeditor.js
:
...
import request, from '../utils/request';
class bookeditor extends react.component
request(method, apiurl, )
.then((res) => else
}).catch((err) => console.error(err));
} getrecommendusers (partialuserid)
...});
} ...
}...
其他還有/src/components/usereditor.js
、/src/pages/bookedit.js
、/src/pages/booklist.js
、/src/pages/useredit.js
和/src/pages/userlist.js
檔案須要進行對應的改動。
如今嘗試訪問一下使用者列表頁,發現**裡面並沒有資料。因為沒有登入介面訪問被拒絕了而且嘗試跳轉到路由』/login』。
如今來實現乙個登入頁面元件。在/src/pages
下新建login.js檔案;
title="請登入">
登入頁面元件和usereditor或者bookeditor相似,都是乙個表單。
在這裡提交表單成功後跳轉到首頁。
最後,別忘了加上登入頁面的路由。
React全家桶專案
利用業餘時間,做了個react專案,算是成品吧,比較簡單,還有很多瑕疵。目錄結構相當簡單。沒有資料庫,你們執行不起來。想執行起來的話,把express呼叫資料庫的部分全刪掉,寫死資料。這個整合了react全家桶,可以直接執行,也可以直接在生產環境使用。最好用谷歌遊覽器進行體驗,其他遊覽器沒測。封裝了...
React全家桶環境搭建過程
1.從零開始搭建webpack react開發環境 2.引入typescript 安裝依賴 npm i s types react types react dom npm i d typescript awesome typescript loader source map loader 新建tsc...
React學習筆記 二 react全家桶專案實戰
技術棧 react redux react redux react router dom redux thunk axios ui框架是採用螞蟻金服的 antd design 因為只實現了幾個功能,頁面較少,所以採用的架構是按照型別劃分頁面結構,並且採用容器元件與ui元件分離的方式,這樣的話ui元件...