- Authentication (认证): 你是谁?
- Authorization (授权): 你能干什么?
比如你去酒店开房,你需要拿身份证办理Check in,这是一个认证过程,身份证和密码的功效是一样的证明了你是谁,前台给你的房卡表示授权你开302房间,你不能用身份证去开别人房间吧,这就是认证和授权的区别。
整个授权过程有2个重要的概念:
- role
- scope (permission) 两个词汇同一概念,我们暂时用scope来表示
从零开始
我们写了两个api, 分别都需要认证,
let users = [
{
id: 1, name: 'foo' },
{
id: 2, name: 'bar' }
];
/**
* List all users
* auth: required
*/
router.get('/users', auth(), async ctx => {
ctx.body = users;
});
/**
* Update user
* auth: required
*/
router.patch('/users/:id', auth(), async ctx => {
let target = null;
try {
target = _.find(users, x => x.id === Number.parseInt(ctx.params.id));
target.name = target.name.toUpperCase();
ctx.body = target;
} catch (error) {
ctx.throw(404, error);
}
});
这里mock了一个auth的middleware,完成用户foo的认证,
let auth = () => {
return async (ctx, next) => {
ctx.user = {
name: 'foo' };
await next();
}
};
这个时候我们来了一个需求,普通用户可以查看所有用户,但只有管理员可以修改用户,给user加上role [user | admin], 然后在api中判断一下就搞定了,