Skip to content

Commit

Permalink
implement generate_jwt!/2 and verify_jwt/2 for #9
Browse files Browse the repository at this point in the history
  • Loading branch information
nelsonic committed Apr 24, 2020
1 parent b57d545 commit 1bf6bbd
Showing 1 changed file with 43 additions and 5 deletions.
48 changes: 43 additions & 5 deletions lib/token.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,19 @@ defmodule AuthPlug.Token do
@moduledoc """
Token module to create and validate jwt.
see https://hexdocs.pm/joken/configuration.html#module-approach
"""
use Joken.Config
@secret System.get_env("SECRET_KEY_BASE")
@signer Joken.Signer.create("HS256", @secret)

@doc """
`create_signer/1` creates a signer for the given `secret` key.
It uses the HS256 (HMAC with SHA-256) to generate the signature.
if you're wondering what "HS256" is, read:
community.auth0.com/t/jwt-signing-algorithms-rs256-vs-hs256/7720
"""
def create_signer(secret) do
Joken.Signer.create("HS256", secret)
end

@impl true
def token_config do
Expand All @@ -17,11 +25,21 @@ defmodule AuthPlug.Token do
@doc """
`generate_jwt!/1` invokes `Joken.generate_and_sign/3`
claims are the data to be signed.
Throws an error if anyting in the claims is invalid.
"""
def generate_jwt!(claims) do
generate_jwt!(claims, @secret)
end

@doc """
`generate_jwt!/2` invokes `Joken.generate_and_sign/3`
`claims` are the data to be signed and `secret` is the secret key.
"""
def generate_jwt!(claims, secret) do
signer = create_signer(secret)
{:ok, token, _claims} =
token_config()
|> Joken.generate_and_sign(claims, @signer)
|> Joken.generate_and_sign(claims, signer)

token
end
Expand All @@ -31,19 +49,39 @@ defmodule AuthPlug.Token do
where the claims are the original data that were signed.
"""
def verify_jwt(token) do
verify_jwt(token, @secret)
end

@doc """
`verify_jwt/2` verifies the given JWT and secret.
Returns {:ok, claims} where the claims are the original data that were signed.
"""
def verify_jwt(token, secret) do
signer = create_signer(secret)
token_config()
|> Joken.verify_and_validate(token, @signer)
|> Joken.verify_and_validate(token, signer)
end

@doc """
`verify_jwt!/1` verifies the given JWT and returns claims
where the claims are the original data that were signed.
"""
def verify_jwt!(token) do
verify_jwt!(token, @secret)
end

@doc """
`verify_jwt!/2` verifies the given JWT and returns claims
where the `token` is the JWT that was signed `secret` is the secret key.
Returns `claims` the original claims contained in the JWT.
"""
def verify_jwt!(token, secret) do
signer = create_signer(secret)
{:ok, claims} =
token_config()
|> Joken.verify_and_validate(token, @signer)
|> Joken.verify_and_validate(token, signer)

claims
end

end

0 comments on commit 1bf6bbd

Please sign in to comment.