Simple token authentication logic with JWTs for Rails apps. No baked in routing, just the barebones logic you need to implement token authentication with JWTs.
Add this line to your application's Gemfile:
gem 'lp_token_auth'
And then execute:
$ bundle
Or install it yourself as:
$ gem install lp_token_auth
- Run
bundle exec rails generate lp_token_auth:install
to generate an initializer at../config/initalizers/lp_token_auth.rb
. See the initializer for more details about what is configurable. - In the most senior controller that you want to authenticate, add
include LpTokenAuth::Controller
. This gives you 4 methods that are available in this and all child controllers:
login(user)
- Given a valid user, this will generate a JWT and return it. The token should be sent to the client and passed in the 'Authorization' header in all subsequent requests to the server.authenticate_request!
- This is abefore_action
to use in your controllers that will extract the token from the header and authenticate it before proceeding. If the resource class that you're using is not the defaultUser
, you may override theauthenticate_request!
method by creating a custombefore_action
, in which you may pass in the resource class name.
class AuthenticationController < ApplicationController
include LpTokenAuth::Controller
before_action :authenticate_request
protected
def authenticate_request
authenticate_request!('AdminUser')
end
end
authenticate_token!(token)
- This is called byauthenticate_request!
but is available to use if you ever need to manually authenticate a token.current_user
- This returns the current user identified byauthenticate!
. It is available after logging in the user or authenticating.
- All errors will return an instance of
LpTokenAuth::Error
Version 2.0 contains breaking changes for LP Token Auth. This migration guide contains instructions for using v2.0. Migration Guide
class AuthenticatingController < ApplicationController
include LpTokenAuth::Controller
before_action :authenticate_request!
rescue_from LpTokenAuth::Error, with: :unauthorized
protected
def unauthorized(error)
render json: { data: error.message }, status: :unauthorized
end
end
// Using fetch api
const jwt = '...'
fetch('localhost:3000/authenticated-route', {
headers: {
'Authorization': `Bearer ${jwt}`
...
}
...
})
git clone [email protected]:LaunchPadLab/lp_token_auth.git
bundle install
- Run tests with
rake
Almost! There is a slight dependence on the ActiveRecord method find
, which is used in order to decode a token based on the resource's id
. The current workaround is to make sure the resource class you're using implements find
, and has either a column id
or implements a method called id
.