Giter Site home page Giter Site logo

robophil / sails-hook-jsonwebtoken Goto Github PK

View Code? Open in Web Editor NEW
11.0 6.0 2.0 67 KB

A sails hook for easily working with jsonwebtoken https://github.com/auth0/node-jsonwebtoken

License: MIT License

JavaScript 100.00%
sails-hook jsonwebtoken sails-hook-jsonwebtoken sailsjs

sails-hook-jsonwebtoken's Introduction

sails-hook-jsonwebtoken

A sails hook for easily using jsonwebtoken. It wraps around the popular jsonwebtoken.

install

npm install sails-hook-jsonwebtoken --save
  1. Configure sails-hook-jsonwebtoken
  2. Applying policy for securing routes
  3. Jwt open routes
    1. Signup
    2. Signin
  4. Accessing a secured route
  5. Using the JwtService
  6. Password reset see JwtService functions

configuration

create config file config/jsonWebToken.js and update the defaults to suit your needs

module.exports.jsonWebToken = {
    token_secret: 'i-am-a-secret-token',
    options:{expiresIn: '2h'}, //see below this section for more on `options`
    default_account_status: true,
    afterSignup: function (user) {
        console.log("User account created")
    },
    afterSignin: function (user) {
        console.log("successful login")
    },
    authType: "email" //could be {email or username}
}
  • token_secret - your secret key used for generating token
  • options - see here for options settings
  • default_account_status - status of an account when created, if you need to do any other validation after account has been created set this to false then change to true when this is done. How you treat user account based on the status of this value is up to you
  • authType - This could be email or username. Depending on your application needs
  • afterSignup - This function is called every time a new account is created. The new user account created is passed to this function
  • afterSignin - This function is called every time someone signs in. The user information is passed to the function

policy

There are 3 policies that could be applied to secure your route. They are JwtPolicy, UserIsAdminPolicy and UserIsUserPolicy.

  • JwtPolicy - Simply checks if the incoming request has the right authorization, the user exists and the token passed to it is still valid.

  • UserIsAdminPolicy - Does exactly what the JwtPolicy does, but also checks if the accountType is of the type admin

  • UserIsUserPolicy - Does exactly what the JwtPolicy does, but also checks if the accountType is of the type is user

custom policy to valid another account type?

In real life scenerio, a user model accountType might be an admin, user, customer or any other account type that fits your need. Simply copy the content of UserIsUserPolicy and paste in a new file eg policies/userIsCustomerPolicy.js. Then change the value of ACCOUNT_TYPE to match your need. Eg ACCOUNT_TYPE = "customer"

Apply policy

go to config/policies.js and apply the policy you need to the secure your routes. Visit sails doc here to learn more

//example of how your file might look like
module.exports.policies = {
    '*': 'UserIsUserPolicy', //Secure all routes with UserIsUserPolicy
    'JwtController': {
        '*': true// Make this open to allow for signup and authentication
    },
    'AdminController': {
        '*': 'UserIsAdminPolicy' //secure this route with UserIsAdminPolicy
    },
    'ProfileController': {
        'destroy': 'UserIsAdminPolicy' //only admin can delete a profile, secured with UserIsAdminPolicy
    }
} 

Jwt routes (sign up / sign in)

signup

depening on the value of authType in config/jsonWebToken.js that you created, whose value could be email, or username.

if email, simply send post request here POST /jwt/signup containing the following parameters.

{
    email: '',
    password: '',//minimum length 4
    accountType: '' //if absent, defaults to *user*
}

if username, simply send post request here POST /jwt/signup containing the following parameters.

{
    username: '',
    password: '',//minimum length 4
    accountType: '' //if absent, defaults to *user*
}

returns object if successful. NOTE (email or username) would be part of the object returned depending on your authType

{
    user: {id: '', email: '', username: '', accountType: '', token: '', active: true},//contains user object
    token: ''//deprecated, would be removed soon
}

signin

simply send post request here POST /jwt/auth containing the following parameters

if email

{
    email: '',
    password: '',//minimum length 4
}

if username

{
    username: '',
    password: '',//minimum length 4
}

returns object if successful. NOTE (email or username) would be part of the object returned depending on your authType

{
    user: {id: '', email: '', username: '', accountType: '', token: '', active: true},//contains user object
    token: ''//deprecated, would be removed soon
}

Accessing a secure route

When acessing a route secured by policy, simple add token in Authorization header or through the route. See sample below where token is QWxhZGRpbjpPcGVuU2VzYW1l

Authorization: Bearer QWxhZGRpbjpPcGVuU2VzYW1l

or as parameter token in the request as shown below

http://example.com?token=QWxhZGRpbjpPcGVuU2VzYW1l

Using the JwtService

JwtService.issueToken(payload, user) - This returns a promise containing a token for the user passed to it. payload is the content to be passed into the token and user is the model object of the user you want to generate a token for

JwtService.verifyToken(token) - This returns a promise containing a decoded token if its still valid. token is the token you want to verify

JwtService.createUser(body) - This returns a promise containing the new user object created. body same as object sent during Signup above

JwtService.getPasswordResetToken(email) - This returns a promise containing a token that can be used for resetting the password for the email passed to the function

JwtService.resetPassword(newpassword, token) - This returns a promise containing a message when the password is successfully changed. newpassword is the new password for the account while token is the token generated for the email, see JwtService.getPasswordResetToken(email) to get a token.

Changelog

See the different releases here

Liscence

MIT License

sails-hook-jsonwebtoken's People

Contributors

robophil avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

sails-hook-jsonwebtoken's Issues

Stable version 1.0

  • Adding callback on successful signin and signup

  • standard error response code and format

  • multiple account type

  • relegate more task to service

  • password reset

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.