kemal-auth-token

Version, currently master branch1 version
  • master branchlatestDec 12, 2018

github.com/dscottboggs/kemal-auth-token

Kemal middleware to authentication via HTTP header token using JWT

0 stars
1 dependent
License: MIT

Installation

# Add this to your shard.yml
dependencies:
  kemal-auth-token:
    github: dscottboggs/kemal-auth-token
    branch: master

master is a branch, not a release, so this tracks it rather than pinning a version.

Then run:

shards install

shard.yml

Crystal
0.27.0
License
MIT
Author
Aleksander Kwiatkowski
Target
  • kemal-auth-token from src/kemal-auth-token.cr

Dependencies

Runtime Dependencies

  • jwt*github: crystal-community/jwt
  • kemal*github: kemalcr/kemal

README

kemal-auth-token

Gives the current_user to kemal.

Installation

Add this to your application's shard.yml:

dependencies:
  kemal-auth-token:
    github: akwiatkowski/kemal-auth-token

Usage

Initializer

First, you need to initialize middleware.

auth_token_mw = Kemal::AuthToken.new

Sign in

You must provide a way to sign user in. It is your choice how would you like to do it (fetch from DB, have predefined, ...).

You must return UserHash it is alias of Hash(String, (String | Int32 | Nil | Bool)).

You can use login, id, whatever instead of an email.

auth_token_mw.sign_in do |email, password|
  User.sign_in(email, password)
end

There is path to sign in, which you can change if you want.

auth_token_mw.path = "/sign_in" # default value

If you want sign in just execute POST request:

http = HTTP::Client.new("localhost", Kemal.config.port)
result = http.post_form("/sign_in", {"email" => "email@email.org", "password" => "password" })
json = JSON.parse(result.body)

Which return

{"token":"some weird characters"}

Using token

Next request can utilize token based authentication. You must provide it within HTTP headers.

headers = HTTP::Headers.new
headers["X-Token"] = "some weird characters"
http = HTTP::Client.new("localhost", Kemal.config.port)
result = http.exec("GET", "/path", headers)

Get current user

Kemal needs a way how to get user information from JWT token. You must tell how it should do.

auth_token_mw.load_user do |jwt_payload|
  User.load_user(jwt_payload)
end

Keep in mind that jwt_payload is Hash(String, JSON::Any).

You need to provide way to get user information from object (UserHash) stored in JWT token here. That information should be presented also as UserHash.

Later you can access current user information within Kemal code as below:

get "/current_user" do |env|
  env.current_user.to_json
end

Final note

Please read spec file :)

Development

TODO: Write development instructions here

Contributing

  1. Fork it ( https://github.com/akwiatkowski/kemal-auth-token/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

Contributors