项目作者: hsynlms

项目描述 :
A simple user role and scope checker plugin to protect endpoints for Fastify
高级语言: JavaScript
项目地址: git://github.com/hsynlms/fastify-guard.git
创建时间: 2020-08-27T19:02:08Z
项目社区:https://github.com/hsynlms/fastify-guard

开源协议:MIT License

下载


fastify-guard

A simple user role and scope check plugin to protect endpoints for Fastify.

Downloads
install size

fastify-guard is designed to protect API endpoints by checking authenticated user roles and/or scopes if they met. guard is the registered Fastify decorator and can be used in anywhere.

Inspired by express-jwt-permissions.

Install

  1. $ npm install fastify-guard

Compatibility

Plugin version Fastify version
^3.0.0 ^5.0.0
^2.0.0 ^4.0.0
^1.0.0 ^3.0.0

Usage

  1. const fastify = require('fastify')()
  2. const fastifyGuard = require('fastify-guard')
  3. fastify.register(
  4. fastifyGuard,
  5. {
  6. errorHandler: (result, req, reply) => {
  7. return reply.send('you are not allowed to call this route')
  8. }
  9. }
  10. )
  11. // this route can only be called by users who has 'cto' and 'admin' roles
  12. fastify.get(
  13. '/admin',
  14. { preHandler: [fastify.guard.role(['cto', 'admin'])] },
  15. (req, reply) => {
  16. // 'user' should already be defined in req object
  17. reply.send(req.user)
  18. }
  19. )
  20. // this route can only be called by users who has 'admin' or 'editor' role
  21. fastify.get(
  22. '/',
  23. { preHandler: [fastify.guard.role('admin', 'editor')] },
  24. (req, reply) => {
  25. // 'user' should already be defined in req object
  26. reply.send(req.user)
  27. }
  28. )
  29. /*
  30. http://localhost:3000 -> will print out below result if the authenticated user does not have 'admin' role
  31. you are not allowed to call this route
  32. */
  33. fastify.get(
  34. '/has-role',
  35. (req, reply) => {
  36. // 'user' should already be defined in req object
  37. reply.send(
  38. fastify.guard.hasRole(req, 'admin') // will return a boolean value
  39. )
  40. }
  41. )
  42. fastify.get(
  43. '/has-scope',
  44. (req, reply) => {
  45. // 'user' should already be defined in req object
  46. reply.send(
  47. fastify.guard.hasScope(req, 'profile') // will return a boolean value
  48. )
  49. }
  50. )
  51. fastify.listen(3000, () => {
  52. console.log('Fastify server is running on port: 3000')
  53. })
  54. /*
  55. http://localhost:3000 -> will print out below result if the authenticated user does not have 'admin' role
  56. you are not allowed to call this route
  57. */

Options

Name Type Default Description
requestProperty string user The authenticated user property name that fastify-guard will search in request object
roleProperty string role The role property name that fastify-guard will search in authenticated user object
scopeProperty string scope The scope property name that fastify-guard will search in authenticated user object
errorHandler function undefined Custom error handler to manipulate the response that will be returned. As fallback, default HTTP error messages will be returned.

API

guard.role(role)

Returns a function which checks if the authenticated user has the given role(s). Multiple roles can be sent as separated parameters or in an array. If the given role(s) was not assigned to the authenticated user, the function will throw an HTTP Error (if no errorHandler provided in options otherwise the errorHandler will be invoked). The function supposed to be used in preHandler hook.

guard.hasRole(request, role)

Returns a boolean value which indicates the authenticated user has the given role.

request is the Fastify request object

role is role name

guard.scope(scope)

Returns a function which checks if the authenticated user has the given scope(s). Multiple scopes can be sent as separated parameters or in an array. If the given scope(s) was not assigned to the authenticated user, the function will throw an HTTP Error (if no errorHandler provided in options otherwise the errorHandler will be invoked). The function supposed to be used in preHandler hook.

guard.hasScope(request, scope)

Returns a boolean value which indicates the authenticated user has the given scope.

request is the Fastify request object

scope is scope name