Typography

活版印字


  • Home
  • Archive
  • Categories
  • Tags
  •  

© 2020 alincode

Theme Typography by Makito

Proudly published with Hexo

JWT (4) Server Side 實作範例

Posted at 2016-03-03 JWT  jwt sails jsonwebtoken 

Server Side 使用架構 Sails

Server Side 需要做的事

第一步

安裝支援 JWT 的 library

1
npm install jsonwebtoken -save

第二步

新增一個 JWT 的 Service,例如 api/services/JWTService.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var jwt = require('jsonwebtoken');

// 建立 Token
module.exports.issueToken = function(payload, options) {
if(!options){
options = {};
options.expiresIn = '3h';
}
try {
var token = jwt.sign(payload, sails.config.jwt.token_secret, options);
return token;
} catch (e) {
throw e;
}
};

// 驗證 Token
module.exports.verifyToken = function(token, callback) {
try {
return jwt.verify(token, sails.config.jwt.token_secret, {}, callback);
} catch (e) {
throw e;
}
};

第三步

在回傳登入成功 responses 的地方,多新增回傳 Token 這個值。

1
2
3
4
5
6
7
8
9
// payload 有很多變數,sub 只是其中一個,詳情請看 JWT 官方文件。
var token = JWTService.issueToken({
sub: user.id
});

res.ok({
nikename: user.nickname, // 可有可無,但登入成功,通常會顯示暱稱,對吧。
token: token
});

第四步

在 api/responses 目錄下,新增一個 unauthorized.js,status code 為 401。

第五步

新增一個 policies,api/policies/authToken.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
module.exports = function(req, res, next) {
var token;

// 驗證 Header 格式
if (req.headers && req.headers.authorization) {
var parts = req.headers.authorization.split(' ');
if (parts.length == 2) {
var scheme = parts[0],
credentials = parts[1];

if (/^Bearer$/i.test(scheme)) {
token = credentials;
}
} else {
return res.unauthorized('wrongFormat');
}
} else if (req.param('token')) {
token = req.param('token');
// We delete the token from param to not mess with blueprints
delete req.query.token;
} else {
return res.unauthorized('noAuthorizationHeaderFound');
}

// 驗證 Token 真偽及效期
JWTService.verifyToken(token, function(err, decodedToken) {
if (err) return res.unauthorized('invalidToken');
sails.log.verbose('decodedToken.sub:', decodedToken.sub);

// decodedToken,就是 payload 資料。
db.User.findById(decodedToken.sub).then(function(user){
if(user){
req.user = user;
next();
}else{
return res.unauthorized('noAuthorizationHeaderFound');
}
});
});
};

第六步

config/policies.js 依照 Controller method 需要權限驗證的地方,加入設定。

1
2
3
4
5
6
7
module.exports.policies = {

UserController: {
apiGetMe: ['authToken']
}

};

第七步

api/controllers/UserController.js

1
2
3
4
apiGetMe: async(req, res) => {
// 因為 policies 已經做過權限檢查,並把 user 資料塞好了,這邊就直接拿來用囉,開心 ^_^。
var user = req.user;
}

Share 

 Previous post: NPM bin 執行順序 Next post: JWT (3) 什麼是 JWT 

© 2020 alincode

Theme Typography by Makito

Proudly published with Hexo