Giter Club home page Giter Club logo

auctoritas's Introduction

Alt text

Session like authentication library for Elixir applications

V1.0 release goals

  • Sliding session type
  • Static session type
  • Refresh token session type
  • Unit tests
  • Refresh token <-> Token link
  • Plug integration
  • Improve documentation
  • Default data_store (Cachex; Erlang ETS)
  • Redis data_store

Installation

def deps do
  [
    {:auctoritas, "~> 0.9.0"}
  ]
end

Basic Usage

iex> auth_data = %{user_id: 123}
%{user_id: 123}


iex> {:ok, token} = Auctoritas.authenticate(auth_data)
{:ok, "35cdc028d1623b58f616d21386d1c7982b25183776b7af69f9bb7dc0852a5095"}

iex> {:ok, data} = Auctoritas.get_token_data(token)
{:ok,
 %Auctoritas.DataStorage.Data{
   data: %{user_id: 123},
   metadata: %{
     expires_in: 86385250,
     inserted_at: 1547158890,
     updated_at: 1547158890
   }
 }}
 
 iex> {:ok, data} = Auctoritas.deauthenticate(token)
 {:ok, true}

Token types

Auctoritas supports three types of token management

  • Sliding tokens (DEFAULT): Refreshes token expiration when accessing token
  • Static tokens: Static expiration time
  • [Refresh token] tokens: Returns token and refresh_token which you can use to "refresh/regenerate" token

Sliding tokens (default)

Config:
config :auctoritas, :config,
       name: "auctoritas_default",
       data_storage: Auctoritas.AuthenticationManager.CachexDataStorage,
       token_manager: Auctoritas.AuthenticationManager.DefaultTokenManager,
       token_type: :sliding,
       expiration: 60 * 60 * 24
Example:
iex> auth_data = %{user_id: 123}
%{user_id: 123}

iex> {:ok, token, data} = Auctoritas.authenticate(auth_data)
{:ok,
 "HmVRfaeUzl/6kKK/Kw191960Kw5OAXUB23/4s0/DBlvNUHehQrLL8ufM4tSzO5FY5tME85VuZAHz4Bh4sn6wcQ==",
 %Auctoritas.DataStorage.Data{
   data: %{user_id: 123},
   metadata: %{
     expires_in: 86400,
     inserted_at: 1547665009,
     updated_at: 1547665009
   },
   refresh_token: nil
 }}


iex> {:ok, data} = Auctoritas.get_token_data(token) # Refreshes token expiration
{:ok,
 %Auctoritas.DataStorage.Data{
    data: %{user_id: 123},
    metadata: %{
      expires_in: 86400,
      inserted_at: 1547665009,
      updated_at: 1547665009
    },
    refresh_token: nil
  }}
 
 iex> {:ok, true} = Auctoritas.deauthenticate(token) # Deletes token and its data
 {:ok, true}

Static tokens

config :auctoritas, :config,
       name: "auctoritas_default",
       data_storage: Auctoritas.AuthenticationManager.CachexDataStorage,
       token_manager: Auctoritas.AuthenticationManager.DefaultTokenManager,
       token_type: :static,
       expiration: 60 * 60 * 24
Example:
iex> auth_data = %{user_id: 123}
%{user_id: 123}

iex> {:ok, token, data} = Auctoritas.authenticate(auth_data)
{:ok,
 "HmVRfaeUzl/6kKK/Kw191960Kw5OAXUB23/4s0/DBlvNUHehQrLL8ufM4tSzO5FY5tME85VuZAHz4Bh4sn6wcQ==",
 %Auctoritas.DataStorage.Data{
    data: %{user_id: 123},
    metadata: %{
      expires_in: 86400,
      inserted_at: 1547665009,
      updated_at: 1547665009
    },
    refresh_token: nil
  }}

iex> {:ok, data} = Auctoritas.get_token_data(token) # Wont refresh token expiration
{:ok,
 %Auctoritas.DataStorage.Data{
   data: %{user_id: 123},
   metadata: %{
     expires_in: 86385250,
     inserted_at: 1547158890,
     updated_at: 1547158890
   }
 }}
 
 iex> {:ok, true} = Auctoritas.deauthenticate(token) # Deletes token and its data
 {:ok, true}

[Refresh token] tokens

config :auctoritas, :config,
       name: "auctoritas_default",
       data_storage: Auctoritas.AuthenticationManager.CachexDataStorage,
       token_manager: Auctoritas.AuthenticationManager.DefaultTokenManager,
       token_type: :refresh_token,
       expiration: 60 * 60 * 24,
       refresh_token_expiration: 60 * 60 * 24 * 3
Example:
iex> auth_data = %{user_id: 123}
%{user_id: 123}

iex> {:ok, token, refresh_token, data, auth_data} = Auctoritas.authenticate(auth_data)
{:ok,
 "Ny3yd4NTO2Q5q9ZZa3g2PibUQGkw6xxq9/NnBo7LvvkQzqBYXP683spTSUUipr6ATrxdjW0lumjNmTPxhuFtHw==", # Token
 "vKf1sWIw2Ap4tB3YjNKNvNyA9LZavsUYSBGW4x1/xgfdv024ja+brhyO1rqLiFRqS4PcGgb3U9+cctBe0n1yUQ==", # Refresh token
 %Auctoritas.DataStorage.Data{
   data: %{user_id: 123},
   metadata: %{
     expires_in: 86400,
     inserted_at: 1547667186,
     updated_at: 1547667186
   },
   refresh_token: "vKf1sWIw2Ap4tB3YjNKNvNyA9LZavsUYSBGW4x1/xgfdv024ja+brhyO1rqLiFRqS4PcGgb3U9+cctBe0n1yUQ=="
 },
 %Auctoritas.DataStorage.RefreshTokenData{
   auth_data: %{user_id: 123},
   metadata: %{
     expires_in: 259200,
     inserted_at: 1547667186,
     updated_at: 1547667186
   },
   token: "Ny3yd4NTO2Q5q9ZZa3g2PibUQGkw6xxq9/NnBo7LvvkQzqBYXP683spTSUUipr6ATrxdjW0lumjNmTPxhuFtHw=="
 }}


iex> {:ok, data} = Auctoritas.get_token_data(token)
{:ok,
 %Auctoritas.DataStorage.Data{
   data: %{user_id: 123},
   metadata: %{
     expires_in: 84656,
     inserted_at: 1547667186,
     updated_at: 1547667186
   },
   refresh_token: "vKf1sWIw2Ap4tB3YjNKNvNyA9LZavsUYSBGW4x1/xgfdv024ja+brhyO1rqLiFRqS4PcGgb3U9+cctBe0n1yUQ==" # Refresh token is linked to regular token
 }}
 
iex> {:ok, data} = Auctoritas.get_refresh_token_data(token)
{:ok,
 %Auctoritas.DataStorage.RefreshTokenData{
   auth_data: %{user_id: 123},
   metadata: %{
     expires_in: 257245,
     inserted_at: 1547669051,
     updated_at: 1547669051
   },
   token: "Ny3yd4NTO2Q5q9ZZa3g2PibUQGkw6xxq9/NnBo7LvvkQzqBYXP683spTSUUipr6ATrxdjW0lumjNmTPxhuFtHw=="
 }}

 
 iex> {:ok, true} = Auctoritas.deauthenticate(token) # Deletes only token
 {:ok, true}
 
 iex> {:ok, token, refresh_token, data, auth_data} = Auctoritas.refresh_token(refresh_token) # Refreshes token with refresh_token (generates new token and refresh_token)
{:ok,
 "nQYX+ezqnKibvnku8YebdiA0fAZ5l1cfVUYrTkYvT+l3CxB215fmhJx0/YevbnockZl/XZVbp0LzBQWvAcafdw==", # Token
 "wqHGH3mrzfABcRQusqO/HvRP+VgqyEEGEOZjQJNbh+B58/gcx5iBqsypDu6djAUlme2rB07X2q/oU/LKVLK3UQ==", # Refresh token
 %Auctoritas.DataStorage.Data{
   data: %{user_id: 123},
   metadata: %{
     expires_in: 86400,
     inserted_at: 1547669051,
     updated_at: 1547669051
   },
   refresh_token: "wqHGH3mrzfABcRQusqO/HvRP+VgqyEEGEOZjQJNbh+B58/gcx5iBqsypDu6djAUlme2rB07X2q/oU/LKVLK3UQ=="
 },
 %Auctoritas.DataStorage.RefreshTokenData{
   auth_data: %{user_id: 123},
   metadata: %{
     expires_in: 259200,
     inserted_at: 1547669051,
     updated_at: 1547669051
   },
   token: "nQYX+ezqnKibvnku8YebdiA0fAZ5l1cfVUYrTkYvT+l3CxB215fmhJx0/YevbnockZl/XZVbp0LzBQWvAcafdw=="
 }}

 
 iex> {:ok, true} = Auctoritas.deauthenticate(refresh_token, :refresh_token) # Deletes refresh token + token
 {:ok, true}

auctoritas's People

Contributors

norbert-k avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar

auctoritas's Issues

Refactor token_manager module

Split generate_token_and_data function into generate_token and generate_data functions.

Refactored functions:

  • generate_token: token generation (executed when creating token)
  • generate_data: data validation/filtration etc... (executed when creating token)
  • generate_refresh_token: refresh token generation (executed when creating refresh token)
  • generate_refresh_data: refresh data validation/filtration etc... (executed when refreshing token with refresh token)

Move token types out of configuration and into creation/authentication functions

Instead of defining token types for specific token storage in configuration files

config :auctoritas, :config,
       name: "auctoritas_default",
       data_storage: Auctoritas.AuthenticationManager.CachexDataStorage,
       token_manager: Auctoritas.AuthenticationManager.DefaultTokenManager,
       token_type: :sliding,
       expiration: 60 * 60 * 24

Move token type definition to creation/authentication functions
For eg:

iex> auth_data = %{user_id: 123}
%{user_id: 123}

iex> {:ok, token, data} = Auctoritas.authenticate(type: :sliding_token, expiration: 60 * 60 * 24, data: auth_data)
{:ok,
 "HmVRfaeUzl/6kKK/Kw191960Kw5OAXUB23/4s0/DBlvNUHehQrLL8ufM4tSzO5FY5tME85VuZAHz4Bh4sn6wcQ==",
 %Auctoritas.DataStorage.Data{
   data: %{user_id: 123},
   metadata: %{
     expires_in: 86400,
     inserted_at: 1547665009,
     updated_at: 1547665009
   },
   refresh_token: nil
 }}

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.