easy_jwt_auth 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +149 -0
- data/Rakefile +2 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/easy_jwt_auth.gemspec +27 -0
- data/lib/easy_jwt_auth/config.rb +25 -0
- data/lib/easy_jwt_auth/errors.rb +4 -0
- data/lib/easy_jwt_auth/rails_helper.rb +16 -0
- data/lib/easy_jwt_auth/token_builder.rb +21 -0
- data/lib/easy_jwt_auth/user_finder.rb +32 -0
- data/lib/easy_jwt_auth/version.rb +3 -0
- data/lib/easy_jwt_auth.rb +7 -0
- metadata +119 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bdb72f71463698bea4bf0bdeae3604bfdf61217f
|
4
|
+
data.tar.gz: 2dca509e9a4b28f06ecdf8e5ad3056c4c240e201
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a61272b4f484efb0eb04da710d7c80d46d05bdf4edfc0896292d158e63d18d56ac33367acb564c40bedd71a51ff5878791bcdaa3bece34809786de065b284d62
|
7
|
+
data.tar.gz: 5b5220cd1fedf188b19d6b468a077c33fb7093a67db3c2cd1fe2d8569e036297434fa412e893a1c08f13d4b701df768b4d270b9222bce0d0cccf9e7476498f71
|
data/.gitignore
ADDED
data/CODE_OF_CONDUCT.md
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# Contributor Code of Conduct
|
2
|
+
|
3
|
+
As contributors and maintainers of this project, and in the interest of
|
4
|
+
fostering an open and welcoming community, we pledge to respect all people who
|
5
|
+
contribute through reporting issues, posting feature requests, updating
|
6
|
+
documentation, submitting pull requests or patches, and other activities.
|
7
|
+
|
8
|
+
We are committed to making participation in this project a harassment-free
|
9
|
+
experience for everyone, regardless of level of experience, gender, gender
|
10
|
+
identity and expression, sexual orientation, disability, personal appearance,
|
11
|
+
body size, race, ethnicity, age, religion, or nationality.
|
12
|
+
|
13
|
+
Examples of unacceptable behavior by participants include:
|
14
|
+
|
15
|
+
* The use of sexualized language or imagery
|
16
|
+
* Personal attacks
|
17
|
+
* Trolling or insulting/derogatory comments
|
18
|
+
* Public or private harassment
|
19
|
+
* Publishing other's private information, such as physical or electronic
|
20
|
+
addresses, without explicit permission
|
21
|
+
* Other unethical or unprofessional conduct
|
22
|
+
|
23
|
+
Project maintainers have the right and responsibility to remove, edit, or
|
24
|
+
reject comments, commits, code, wiki edits, issues, and other contributions
|
25
|
+
that are not aligned to this Code of Conduct, or to ban temporarily or
|
26
|
+
permanently any contributor for other behaviors that they deem inappropriate,
|
27
|
+
threatening, offensive, or harmful.
|
28
|
+
|
29
|
+
By adopting this Code of Conduct, project maintainers commit themselves to
|
30
|
+
fairly and consistently applying these principles to every aspect of managing
|
31
|
+
this project. Project maintainers who do not follow or enforce the Code of
|
32
|
+
Conduct may be permanently removed from the project team.
|
33
|
+
|
34
|
+
This code of conduct applies both within project spaces and in public spaces
|
35
|
+
when an individual is representing the project or its community.
|
36
|
+
|
37
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
38
|
+
reported by contacting a project maintainer at pvratsalis@gmail.com. All
|
39
|
+
complaints will be reviewed and investigated and will result in a response that
|
40
|
+
is deemed necessary and appropriate to the circumstances. Maintainers are
|
41
|
+
obligated to maintain confidentiality with regard to the reporter of an
|
42
|
+
incident.
|
43
|
+
|
44
|
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
45
|
+
version 1.3.0, available at
|
46
|
+
[http://contributor-covenant.org/version/1/3/0/][version]
|
47
|
+
|
48
|
+
[homepage]: http://contributor-covenant.org
|
49
|
+
[version]: http://contributor-covenant.org/version/1/3/0/
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2017 Pantelis Vratsalis
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
# EasyJwtAuth
|
2
|
+
|
3
|
+
Welcome to EasyJwtAuth! EasyJwtAuth is a ruby gem that allows easy use of JWT tokens in any ruby project or rails application, typically for authenticating and authorizing requests.
|
4
|
+
|
5
|
+
A typical usecase of JWT tokens is when building an API. JWT tokens can be sent as authorization tokens in headers. The advantage of using JWT tokens is that they are signed with a secret, so the information inside them cannot be tampered. This makes them ideal for embeding both authentication and authorization information in one step (e.g. by "decoding" the token, one can get information about the user and the roles a user has in case of a role-based authorization).
|
6
|
+
|
7
|
+
Also, the fact that expiration timestamps can be embedded in the data of the token and be handled automatically, can be used to easily build short-lived tokens, making an API more secure.
|
8
|
+
|
9
|
+
|
10
|
+
## Dependencies
|
11
|
+
|
12
|
+
The only dependency of EasyJwtAuth is the [jwt gem](https://github.com/jwt/ruby-jwt).
|
13
|
+
|
14
|
+
## Installation
|
15
|
+
|
16
|
+
### Using rubygems
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
gem install easy_jwt_auth
|
20
|
+
```
|
21
|
+
|
22
|
+
### Using bundler
|
23
|
+
|
24
|
+
Add the following to your Gemfile
|
25
|
+
```ruby
|
26
|
+
gem 'easy_jwt_auth'
|
27
|
+
```
|
28
|
+
and the run
|
29
|
+
```bash
|
30
|
+
bundle install
|
31
|
+
```
|
32
|
+
|
33
|
+
## Usage
|
34
|
+
|
35
|
+
#### In Rails projects
|
36
|
+
For Rails project, the only real configuration needed is to create an initializer (e.g. easy_jwt_auth.rb):
|
37
|
+
|
38
|
+
#### Setup
|
39
|
+
```ruby
|
40
|
+
EasyJwtAuth::Config.tap do |c|
|
41
|
+
c.set_expiration 3600 # expiration of jwt token in seconds
|
42
|
+
c.set_algo 'HS256' # the algorithm used for signing the data
|
43
|
+
c.set_secret 's3cr3t' # the secret to use for signing the data
|
44
|
+
c.set_finder_method ->(id) { User.find(id) }
|
45
|
+
end
|
46
|
+
```
|
47
|
+
The first 3 configuration settings are self explanatory, but in short:
|
48
|
+
* **set_expiration** is used to set the expiration of the token in seconds. If a token is expired, it will be treated as invalid
|
49
|
+
* **set_algo is** used to set the algorithm used for signing the payload of the JWT token
|
50
|
+
* **set_secret** is used to set secret used in the algorithm for signing the paylod
|
51
|
+
|
52
|
+
The **set_finder_method** setting accepts an object that responds to the call method, so either an object can be passed or a lambda function as in the example. This eliminates the dependency of easy_jwt_auth on ActiveRecord and allows you have a model different than User or even get users via repositories. The only requirement of set_finder_method is to be set to an object that responds to call and accepts an id argument (though if you're using ActiveRecord, it's not mandatory to be the id of the model, it can be an email address, a uuid, whatever).
|
53
|
+
|
54
|
+
That's it! This is the only setup needed. EasyJwtAuth comes with a couple of useful helper methods for Rails. To use them in your controllers, just include them in your ApplicationController. For example:
|
55
|
+
|
56
|
+
#### Helpers
|
57
|
+
|
58
|
+
```ruby
|
59
|
+
class ApplicationController < ActionController::API
|
60
|
+
include EasyJwtAuth::RailsHelpers
|
61
|
+
end
|
62
|
+
```
|
63
|
+
|
64
|
+
With this line of code you have gained access to 2 methods:
|
65
|
+
* **jwt_current_user** which gets the Authorization header from the request and finds the user associated with this header (based on the finder method of the configuration step). The result of the jwt_current_user is memoized, so you can use it as many times as you wish without performing extra database queries or expensive operations.
|
66
|
+
* **jwt_authenticate!** which returns a 403 forbidden response with empty response body in case there is no jwt_current_user. This method is useful for authorizing requests to routes you wish to protect as a before_action filter.
|
67
|
+
|
68
|
+
Examples:
|
69
|
+
|
70
|
+
The code below protects the my_secret_route action against non-authorized requests:
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
class SecretController < ApplicationController
|
74
|
+
before_action :jwt_authenticate!, only: [:my_secret_route]
|
75
|
+
|
76
|
+
# this action needs an authorization header with a proper token
|
77
|
+
def my_secret_route
|
78
|
+
render json: { 'user_id': jwt_current_user.id }, status: :ok
|
79
|
+
end
|
80
|
+
|
81
|
+
# this action does not
|
82
|
+
def other_route
|
83
|
+
render json: {}, status: :ok
|
84
|
+
end
|
85
|
+
end
|
86
|
+
```
|
87
|
+
|
88
|
+
#### Generating tokens
|
89
|
+
|
90
|
+
In order to generate a jwt token, you can use the EasyJwtAuth::TokenBuilder's build_token method. The method accepts an id (either the id of the user, which it stores in the token and is used by the finder method of the user finder and jwt_current_user method).
|
91
|
+
|
92
|
+
Example:
|
93
|
+
|
94
|
+
```ruby
|
95
|
+
class LoginController < ApplicationController
|
96
|
+
def login
|
97
|
+
# login logic, eg validate credentials from a login form and find the user
|
98
|
+
token_builder = EasyJwtAuth::TokenBuilder.new
|
99
|
+
render json: { token: token_builder.build_token(user.id) }, status: :ok
|
100
|
+
end
|
101
|
+
end
|
102
|
+
```
|
103
|
+
|
104
|
+
In the example above, the token is returned by the API and can be used for subsequent calls to protected resources (by setting the Authorization header in subsequent requests as "Bearer token_value").
|
105
|
+
|
106
|
+
#### Outside of Rails projects
|
107
|
+
The gem includes a couple of helpers that can be used only in Rails projects, but the rest of the classes can be used by any other project. Specifically:
|
108
|
+
|
109
|
+
**EasyJwtAuth::Config**
|
110
|
+
This is the only requirement in order to configure the gem. The configuration is quite simple. This is common both for Rails and non-Rails projects (for more information see Setup section for Rails projects above).
|
111
|
+
|
112
|
+
**EasyJwtAuth::TokenBuilder**
|
113
|
+
The token builder can be used to generate new tokens. The Config setup should come first before using any of the other classes (like the TokenBuilder). Example:
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
token_builder = EasyJwtAuth::TokenBuilder.new
|
117
|
+
|
118
|
+
# the argument passed is the id used for finding the user by the finder_method configured in the setup step.
|
119
|
+
|
120
|
+
# the id could be a model id
|
121
|
+
token_builder.build_token(50)
|
122
|
+
|
123
|
+
# or an email address for example
|
124
|
+
token_builder.build_token('john@example.com')
|
125
|
+
```
|
126
|
+
|
127
|
+
**EasyJwtAuth::UserFinder**
|
128
|
+
The UserFinder is used to retrieve a user based on the authorization header of the request. The authorization header should be in the form "Bearer token_value". The UserFinder extracts the token_value and finds the id of the user and uses that in order to retrieve the user (by using the finder_method of the setup step).
|
129
|
+
|
130
|
+
Example:
|
131
|
+
|
132
|
+
```ruby
|
133
|
+
# let's build a token
|
134
|
+
token_builder = EasyJwtAuth::TokenBuilder.new
|
135
|
+
token = token_builder.build_token(50)
|
136
|
+
|
137
|
+
header = "Bearer #{token}"
|
138
|
+
uf = EasyJwtAuth::UserFinder.new
|
139
|
+
user = uf.user_from_header(header)
|
140
|
+
```
|
141
|
+
|
142
|
+
## Contributing
|
143
|
+
|
144
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/m1lt0n/easy_jwt_auth. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
145
|
+
|
146
|
+
## License
|
147
|
+
|
148
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
149
|
+
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "easy_jwt_auth"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'easy_jwt_auth/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "easy_jwt_auth"
|
8
|
+
spec.version = EasyJwtAuth::VERSION
|
9
|
+
spec.authors = ["Pantelis Vratsalis"]
|
10
|
+
spec.email = ["pvratsalis@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{easy_jwt_auth is a small gems that can be used in APIs and allows authentication with the use of jwt tokens.}
|
13
|
+
spec.description = %q{With easy_jwt_auth, a client can send a jwt token as the authorization header and the gem will check this header and load the appropriate user if the token is valid and has not expired}
|
14
|
+
spec.homepage = "https://github.com/m1lt0n/easy_jwt_auth"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "exe"
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
+
|
21
|
+
spec.require_paths = ["lib"]
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.12"
|
24
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
25
|
+
spec.add_development_dependency "rspec", "~> 3.5"
|
26
|
+
spec.add_dependency "jwt", "~> 1.5"
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module EasyJwtAuth
|
2
|
+
class Config
|
3
|
+
class << self
|
4
|
+
attr_reader :algo, :expiration, :finder_method, :secret
|
5
|
+
|
6
|
+
def set_algo(algo)
|
7
|
+
@algo = algo
|
8
|
+
end
|
9
|
+
|
10
|
+
def set_expiration(expiration)
|
11
|
+
@expiration = expiration
|
12
|
+
end
|
13
|
+
|
14
|
+
def set_finder_method(finder_method)
|
15
|
+
raise InvalidFinderMethod unless finder_method.respond_to?(:call)
|
16
|
+
|
17
|
+
@finder_method = finder_method
|
18
|
+
end
|
19
|
+
|
20
|
+
def set_secret(secret)
|
21
|
+
@secret = secret
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module EasyJwtAuth
|
2
|
+
module RailsHelper
|
3
|
+
def jwt_current_user
|
4
|
+
return @_jwt_current_user if defined?(@_jwt_current_user)
|
5
|
+
|
6
|
+
auth_header = request.headers['Authorization']
|
7
|
+
@_jwt_current_user = EasyJwtAuth::UserFinder.new.user_from_header(auth_header)
|
8
|
+
rescue StandardError => e
|
9
|
+
nil
|
10
|
+
end
|
11
|
+
|
12
|
+
def jwt_authenticate!
|
13
|
+
head(403) if jwt_current_user.nil?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module EasyJwtAuth
|
2
|
+
class TokenBuilder
|
3
|
+
def initialize
|
4
|
+
@algo = Config.algo
|
5
|
+
@expiration = Config.expiration
|
6
|
+
@secret = Config.secret
|
7
|
+
end
|
8
|
+
|
9
|
+
def build_token(id)
|
10
|
+
iat = Time.now.to_i
|
11
|
+
exp = iat + expiration
|
12
|
+
payload = { id: id, iat: iat, exp: exp }
|
13
|
+
|
14
|
+
JWT.encode(payload, secret, algo)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
attr_reader :algo, :expiration, :secret
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module EasyJwtAuth
|
2
|
+
class UserFinder
|
3
|
+
def initialize
|
4
|
+
@algo = Config.algo
|
5
|
+
@finder_method = Config.finder_method
|
6
|
+
@secret = Config.secret
|
7
|
+
end
|
8
|
+
|
9
|
+
def user_from_header(auth_header)
|
10
|
+
raise InvalidAuthHeader unless valid_header?(auth_header)
|
11
|
+
|
12
|
+
decoded_token = JWT.decode(
|
13
|
+
token_from_header(auth_header), secret, true, { algorithm: algo }
|
14
|
+
)
|
15
|
+
|
16
|
+
data = decoded_token.first
|
17
|
+
finder_method.call(data['id'])
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
attr_reader :algo, :secret, :finder_method
|
23
|
+
|
24
|
+
def token_from_header(auth_header)
|
25
|
+
auth_header.split.last
|
26
|
+
end
|
27
|
+
|
28
|
+
def valid_header?(auth_header)
|
29
|
+
/Bearer (.+)/.match(auth_header)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
metadata
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: easy_jwt_auth
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Pantelis Vratsalis
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-04-19 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.12'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.12'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.5'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.5'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: jwt
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.5'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.5'
|
69
|
+
description: With easy_jwt_auth, a client can send a jwt token as the authorization
|
70
|
+
header and the gem will check this header and load the appropriate user if the token
|
71
|
+
is valid and has not expired
|
72
|
+
email:
|
73
|
+
- pvratsalis@gmail.com
|
74
|
+
executables: []
|
75
|
+
extensions: []
|
76
|
+
extra_rdoc_files: []
|
77
|
+
files:
|
78
|
+
- ".gitignore"
|
79
|
+
- CODE_OF_CONDUCT.md
|
80
|
+
- Gemfile
|
81
|
+
- LICENSE.txt
|
82
|
+
- README.md
|
83
|
+
- Rakefile
|
84
|
+
- bin/console
|
85
|
+
- bin/setup
|
86
|
+
- easy_jwt_auth.gemspec
|
87
|
+
- lib/easy_jwt_auth.rb
|
88
|
+
- lib/easy_jwt_auth/config.rb
|
89
|
+
- lib/easy_jwt_auth/errors.rb
|
90
|
+
- lib/easy_jwt_auth/rails_helper.rb
|
91
|
+
- lib/easy_jwt_auth/token_builder.rb
|
92
|
+
- lib/easy_jwt_auth/user_finder.rb
|
93
|
+
- lib/easy_jwt_auth/version.rb
|
94
|
+
homepage: https://github.com/m1lt0n/easy_jwt_auth
|
95
|
+
licenses:
|
96
|
+
- MIT
|
97
|
+
metadata: {}
|
98
|
+
post_install_message:
|
99
|
+
rdoc_options: []
|
100
|
+
require_paths:
|
101
|
+
- lib
|
102
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
requirements: []
|
113
|
+
rubyforge_project:
|
114
|
+
rubygems_version: 2.5.1
|
115
|
+
signing_key:
|
116
|
+
specification_version: 4
|
117
|
+
summary: easy_jwt_auth is a small gems that can be used in APIs and allows authentication
|
118
|
+
with the use of jwt tokens.
|
119
|
+
test_files: []
|