devise-rownd 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 472c2fc42ba778e0a7b888b3855a26f625ec83c15b5420cedb6441549f8e9336
4
+ data.tar.gz: 81fd0a737715b7be796acb202b7d267a40663128e2fb300d025ccd7f307a09ae
5
+ SHA512:
6
+ metadata.gz: 8aea286cffa63aed1791e8599eb211c9043448dd2ceddf147d489bb09f633dc6c1c134e7ba30220cc52fda5c8eaaeabc650596121dbec73af5d3c750d624147f
7
+ data.tar.gz: 59a104ec432e8fbbc4e2814aff6713da1caf2d330c07e565a353f2c61240d5516e2fd7e93a84c00931592376a443445d39d4c7d3f2015d1dcd41ba9fb37b8704
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2022 Bobby Radford
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,164 @@
1
+ # Devise::Rownd
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/devise-rownd.svg)](https://badge.fury.io/rb/devise-jwt)
4
+
5
+ `devise-rownd` is a [devise](https://github.com/heartcombo/devise) extension that auuthenticates users with Rownd's passwordless authentication strategies. It works in-tandem with the Rownd Hub, a javascript snippet embedded in your website. With this Gem installed, Rownd handles all aspects of user authentication and gives you the tools to customize the user experience on your site.
6
+
7
+ ## Installation
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem 'devise-rownd'
12
+ ```
13
+
14
+ And then execute:
15
+ ```bash
16
+ $ bundle
17
+ ```
18
+
19
+ Or install it yourself as:
20
+ ```bash
21
+ $ gem install devise-rownd
22
+ ```
23
+
24
+ ### Mount the Engine
25
+
26
+ Add this to your `config/routes.rb` file
27
+
28
+ ```rb
29
+ mount Devise::Rownd::Engine, at: '/api/auth/rownd'
30
+ ```
31
+
32
+ ### Rownd Hub
33
+ Follow [these instructions](https://docs.rownd.io/rownd/sdk-reference/web/javascript-browser) to install the Rownd Hub. You'll want to ensure it runs on every page of your application, so be sure to add it as a common in your Rails JS packs. Here's the easiest way to do that:
34
+
35
+ 1. Create a new file in your JS packs director called `rph.js` and paste the JS snippet that you obtained from the instructions listed above.
36
+
37
+ 3. Add the following API callbacks to your Javascript:
38
+ ```javascript
39
+ _rphConfig.push(['setPostAuthenticationApi', {
40
+ method: 'post',
41
+ url: '/api/auth/rownd/authenticate'
42
+ }]);
43
+
44
+ _rphConfig.push(['setPostSignOutApi', {
45
+ method: 'POST',
46
+ url: '/api/auth/rownd/sign_out'
47
+ }]);
48
+
49
+ _rphConfig.push(['setPostUserDataUpdateApi', {
50
+ method: 'POST',
51
+ url: '/api/auth/rownd/update_data'
52
+ }]);
53
+ ```
54
+
55
+ > NOTE: The path prefix `/api/auth/rownd` must match the `Devise::Rownd::Engine` mount path that you specified in your Rails routes
56
+
57
+ 3. Finally, include the Javascript pack in your application layout.
58
+ ```html
59
+ <body>
60
+ <%= show_rownd_signin_if_required %>
61
+ <%= yield %>
62
+ <%= javascript_pack_tag 'rph', 'data-turbolinks-track': 'reload' %>
63
+ </body>
64
+ ```
65
+ There are two key pieces that you musut include in the layout:
66
+
67
+ `<%= show_rownd_signin_if_required %>`
68
+ This renders the Rownd sign in modal to prompt the user for authentication when your app explicitly requires it in a controller
69
+
70
+ `<%= javascript_pack_tag 'rph', 'data-turbolinks-track': 'reload' %>`
71
+ Tells Rails to include the rph Javascript pack. We also tell Turbolinks to include the script on page reloads
72
+
73
+ ## Usage
74
+
75
+ For this to work, you need to define these key environment variables:
76
+
77
+ * `ROWND_APP_ID` - This is the ID of your Rownd application
78
+ * `ROWND_APP_KEY` - Your Rownd application key
79
+ * `ROWND_APP_SECRET` - Your Rownd application secret
80
+
81
+ You can get all of these values from the [Rownd Platform](https://app.rownd.io)
82
+
83
+ ### Users
84
+
85
+ This gem provides a new Devise module named `:rownd_authenticatable`. In your `user` model, you can tell Devise to use it like this:
86
+
87
+ ```ruby
88
+ class User < ApplicationRecord
89
+ devise :rownd_authenticatable
90
+
91
+ ...
92
+ end
93
+
94
+ ```
95
+
96
+ Now, in your `config/routes.rb` file, add the following:
97
+
98
+ ```ruby
99
+ Rails.application.routes.draw do
100
+ devise_for :users
101
+ ...
102
+
103
+ mount Devise::Rownd::Engine, at: '/api/auth/rownd'
104
+ end
105
+ ```
106
+
107
+ ### Require Authentication
108
+
109
+ You can require authentication on a controller's actions the same way you uwould for any Devise strategies.
110
+
111
+ ```ruby
112
+ class MyController < ApplicationController
113
+ before_action :authenticate_user!
114
+
115
+ ...
116
+ end
117
+ ```
118
+
119
+ Now, whenever a user navigates to a route that requires authentication, if a user is not already signed in, Devise will prompt the user to sign into Rownd.
120
+
121
+ ### Customizing the Page using the `current_user`
122
+
123
+ In any of your controllers, views, or helpers, you have access to the currently authenticated user via the `current_user` variable. You can use it to customize your page content like this:
124
+
125
+ ```html
126
+ <h1>Hello, <%= current_user.first_name %>!</h1>
127
+ ```
128
+
129
+ The `current_user` object has all of the fields specified in your Rownd application's schema. If the user doesn't have a value for a particular field, it will be `nil`
130
+
131
+ ### Extending the `current_user` model
132
+
133
+ You can extend the `current_user` object by modifying the `Devise::Rownd::User` class. This can be very helpful if you want to have additionanl functions that aggregate data accross multiple fields, or perform some logic and return the result.
134
+
135
+ For instance, you might want a function called `admin?` that will return if the current user is has an `admin` role. To extend the `current_user` object, add a new initializer in `config/initializers` called `devise_rownd.rb`. In there you can modify the `Devise::Rownd::User` like this:
136
+
137
+ ```ruby
138
+ Devise::Rownd::User.class_eval do
139
+ def admin?
140
+ roles&.include?('admin')
141
+ end
142
+
143
+ def display_name
144
+ fullname = "#{first_name} #{last_name}"
145
+ fullname.present? ? fullname.strip.upcase : email&.upcase
146
+ end
147
+
148
+ ...
149
+ end
150
+ ```
151
+
152
+ Now, you can call things like `current_user.admin?` and `current_user.display_name`
153
+
154
+
155
+
156
+ ### Further Customization
157
+
158
+ All of the other Rownd HTML attributes work as well. You can see a full list of them [here](). This means you have the ability to customize the page with pure HTML, rather than Ruby code, if you prefer
159
+
160
+ ## Contributing
161
+ Please feel free to open up a pull request with any improvements, features, or bug fixes. This is a community effort!
162
+
163
+ ## License
164
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,18 @@
1
+ require "bundler/setup"
2
+
3
+ APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
4
+ load "rails/tasks/engine.rake"
5
+
6
+ load "rails/tasks/statistics.rake"
7
+
8
+ require "bundler/gem_tasks"
9
+
10
+ require "rake/testtask"
11
+
12
+ Rake::TestTask.new(:test) do |t|
13
+ t.libs << 'test'
14
+ t.pattern = 'test/**/*_test.rb'
15
+ t.verbose = false
16
+ end
17
+
18
+ task default: :test
@@ -0,0 +1 @@
1
+ //= link_directory ../stylesheets/devise/rownd .css
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,6 @@
1
+ module Devise
2
+ module Rownd
3
+ class ApplicationController < ActionController::Base
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ # # ONLY NEEDED IN `classic` MODE.
4
+ # require_dependency 'devise/rownd/application_controller'
5
+
6
+ module Devise::Rownd
7
+ class AuthController < ApplicationController
8
+ # Skip authenticity token verification
9
+ skip_before_action :verify_authenticity_token
10
+
11
+ def authenticate
12
+ @access_token = params[:access_token]
13
+
14
+ new_access_token = session[:rownd_user_access_token] != @access_token
15
+
16
+ session[:rownd_user_access_token] = @access_token if new_access_token
17
+
18
+ if new_access_token || session[:rownd_stale_data] == true
19
+ warden.logout(:user)
20
+ warden.authenticate!(scope: :user)
21
+ end
22
+
23
+ render json: {
24
+ message: 'Successfully authenticated user',
25
+ should_refresh_page: new_access_token || session[:rownd_stale_data] == true,
26
+ }, status: :ok
27
+ end
28
+
29
+ def sign_out
30
+ session.delete(:rownd_user_access_token)
31
+ warden.logout(:user)
32
+ render json: {
33
+ message: 'Successfully signed out user',
34
+ return_to: return_to_after_sign_out
35
+ }, status: :ok
36
+ end
37
+
38
+ def update_data
39
+ session[:rownd_stale_data] = true
40
+ warden.logout(:user)
41
+ warden.authenticate!(scope: :user)
42
+ render json: {
43
+ # should_refresh_page: true
44
+ }, status: :ok
45
+ end
46
+
47
+ def healthz
48
+ render json: {
49
+ message: 'Healthy'
50
+ }, status: :ok
51
+ end
52
+
53
+ private
54
+
55
+ def return_to_after_sign_out
56
+ '/'
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,16 @@
1
+ require 'devise/rownd/user'
2
+
3
+ module Devise
4
+ module Rownd
5
+ module ApplicationHelper
6
+ def show_rownd_signin_if_required
7
+ unless flash[:rownd_alert]&.to_sym == :rownd_authentication_required
8
+ flash.keep(:rownd_alert)
9
+ return
10
+ end
11
+
12
+ render partial: 'devise/rownd/signin', locals: { rownd_return_to: session[:user_return_to] }
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,4 @@
1
+ module Devise::Rownd
2
+ module AuthHelper
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module Devise
2
+ module Rownd
3
+ class ApplicationJob < ActiveJob::Base
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,8 @@
1
+ module Devise
2
+ module Rownd
3
+ class ApplicationMailer < ActionMailer::Base
4
+ default from: 'from@example.com'
5
+ layout 'mailer'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ module Devise
2
+ module Rownd
3
+ class ApplicationRecord < ActiveRecord::Base
4
+ self.abstract_class = true
5
+ end
6
+ end
7
+ end
@@ -0,0 +1 @@
1
+ <div data-rownd-request-sign-in data-rownd-return-to="<%= rownd_return_to %>" />
@@ -0,0 +1,2 @@
1
+ <p>Authenticating...</p>
2
+ <div data-rownd-request-sign-in data-rownd-return-to="<%= after_sign_in_path_for(:user) %>" />
data/config/config.rb ADDED
@@ -0,0 +1,17 @@
1
+ # Define the Passages namespace
2
+ module Devise::Rownd
3
+ # Central configuration class
4
+ class Config
5
+ attr_accessor :automount
6
+ end
7
+
8
+ def config
9
+ @config ||= Config.new
10
+ end
11
+
12
+ def configure
13
+ yield config
14
+ end
15
+
16
+ module_function :config, :configure
17
+ end
@@ -0,0 +1,21 @@
1
+ require 'devise/rownd/api'
2
+
3
+ module Devise
4
+ module Rownd
5
+ include API
6
+
7
+ def app_config
8
+ fetch_app_config
9
+ end
10
+
11
+ def self.fetch_app_config
12
+ Rails.cache.fetch("rownd_app_config", expires_in: 15.minutes) do
13
+ response = API.make_api_call('/hub/app-config', { method: 'GET',
14
+ headers: { 'x-rownd-app-key' => app_key } })
15
+ response.body['app'] if response.success?
16
+ end
17
+ end
18
+
19
+ module_function :app_config
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module Devise
2
+ module Rownd
3
+ def app_id
4
+ app_config['id']
5
+ end
6
+
7
+ def app_schema
8
+ app_config['schema']
9
+ end
10
+
11
+ def app_key
12
+ ENV['rownd_app_key'] || ENV['ROWND_APP_KEY'] || ''
13
+ end
14
+
15
+ def app_secret
16
+ ENV['rownd_app_secret'] || ENV['ROWND_APP_SECRET'] || ''
17
+ end
18
+
19
+ module_function :app_id, :app_schema, :app_key, :app_secret
20
+ end
21
+ end
data/config/routes.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'devise/rownd/custom_failure'
2
+
3
+ Devise::Rownd::Engine.routes.draw do
4
+ post '/authenticate' => 'auth#authenticate'
5
+ post '/sign_out' => 'auth#sign_out'
6
+ post '/update_data' => 'auth#update_data'
7
+ get '/healthz' => 'auth#healthz'
8
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'faraday'
4
+ require 'faraday/net_http'
5
+ require 'faraday/retry'
6
+
7
+ module Devise::Rownd
8
+ module API
9
+ def conn
10
+ @conn ||= Faraday.new('https://api.rownd.io') do |f|
11
+ f.request :json
12
+ f.request :retry
13
+ f.response :json
14
+ f.adapter :net_http
15
+ end
16
+ end
17
+
18
+ def make_api_call(path, options = { method: 'GET' })
19
+ conn.send(options[:method].downcase, path, options[:params]) do |request|
20
+ request.body = options[:body].to_json if options[:body]
21
+ request.headers = options[:headers] if options[:headers]
22
+ end
23
+ end
24
+
25
+ module_function :conn, :make_api_call
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ module Devise
2
+ module Rownd
3
+ class CustomAuthFailure < Devise::FailureApp
4
+ def redirect
5
+ store_location!
6
+ if is_flashing_format?
7
+ if flash[:timedout] && flash[:alert]
8
+ flash.keep(:timedout)
9
+ flash.keep(:alert)
10
+ else
11
+ key = i18n_message == :rownd_authentication_required ? :rownd_alert : :alert
12
+ flash[key] = i18n_message
13
+ end
14
+ end
15
+ redirect_to redirect_url
16
+ end
17
+
18
+ def i18n_message(default = nil)
19
+ message = warden_message || default || :unauthenticated
20
+
21
+ return :rownd_authentication_required if message.to_sym == :unauthenticated
22
+
23
+ super(default)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,36 @@
1
+ module Devise
2
+ module Rownd
3
+ class Engine < ::Rails::Engine
4
+ isolate_namespace Devise::Rownd
5
+
6
+ # TODO: Add this to the devise config
7
+ # Look into rails generate devise:install which creates the
8
+ # initializers/devise.rb file
9
+ # config.skip_session_storage = [:http_auth]
10
+
11
+ # mount devise-rownd to the application
12
+ initializer('devise-rownd.mount', after: :load_config_initializers) do |_app|
13
+ if Devise::Rownd.config.automount
14
+ Rails.application.routes.prepend do
15
+ mount Devise::Rownd::Engine, at: '/api/auth/rownd'
16
+ end
17
+ end
18
+ end
19
+
20
+ # add the custom failure app to warden config
21
+ initializer('devise-rownd.devise_failure_app', after: :load_config_initializers) do |_app|
22
+ Devise.setup do |config|
23
+ require 'devise/rownd/custom_failure'
24
+ config.warden do |manager|
25
+ manager.failure_app = Devise::Rownd::CustomAuthFailure
26
+ end
27
+ end
28
+ end
29
+
30
+ # load devise-rownd helpers into the application
31
+ config.to_prepare do
32
+ ::ApplicationController.helper Devise::Rownd::ApplicationHelper
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,35 @@
1
+ require 'active_support/concern'
2
+
3
+ module Devise
4
+ module Models
5
+ module RowndAuthenticatable
6
+ extend ActiveSupport::Concern
7
+
8
+ # TODO: What if we don't interact with the database at all?
9
+ class_methods do
10
+ def find_or_create_with_authentication_profile(profile)
11
+ result = where(user_id: profile['user_id']).first_or_create({ email: profile['email'] })
12
+ result
13
+ end
14
+
15
+ def serialize_from_session(data)
16
+ result = Devise::Rownd::User.new(data)
17
+ # result = find_by_user_id_or_email(user_id, email)
18
+ result
19
+ end
20
+
21
+ def serialize_into_session(resource)
22
+ # result = [resource.data]
23
+ result = [resource]
24
+ # result = [resource['user_id'], resource['email']]
25
+ result
26
+ end
27
+
28
+ # def find_by_user_id_or_email(user_id, email)
29
+ # result = find_by('user_id = ? OR email = ?', user_id, email)
30
+ # result
31
+ # end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,9 @@
1
+ require 'devise/rownd/models/rownd_authenticatable'
2
+
3
+ module Devise
4
+ # Devise models
5
+ #
6
+ # @see Devise::Models
7
+ module Models
8
+ end
9
+ end
@@ -0,0 +1,95 @@
1
+ require 'devise'
2
+ require 'devise/strategies/authenticatable'
3
+ require 'devise/rownd/user'
4
+ require 'devise/rownd/api'
5
+ require 'jose'
6
+
7
+ require_relative '../../../../config/initializers/app_creds'
8
+
9
+ module Devise
10
+ module Strategies
11
+ include ::Devise::Rownd::API
12
+
13
+ class RowndAuthenticatable < Authenticatable
14
+ def valid?
15
+ session[:rownd_user_access_token].present?
16
+ end
17
+
18
+ # All Strategies must define this method.
19
+ def authenticate!
20
+ @access_token = session[:rownd_user_access_token]
21
+ return fail!('No Access Token') unless @access_token
22
+
23
+ decoded_jwt = verify_token(@access_token)
24
+ @app_id = decoded_jwt['aud'].find(/^app:.+/).first.split(':').last
25
+
26
+ configured_app_id = Devise::Rownd.app_id
27
+ ok = @app_id == configured_app_id
28
+ return fail!('JWT not authorized for app') unless ok
29
+
30
+ rownd_user = Devise::Rownd::User.new(fetch_user)
31
+
32
+ return fail!(:unable_to_authenticate) unless rownd_user
33
+
34
+ success!(rownd_user)
35
+ end
36
+
37
+ def return_to_after_sign_out
38
+ '/'
39
+ end
40
+
41
+ def fetch_user
42
+ if session[:rownd_stale_data] == true
43
+ data = fetch_user_from_api
44
+ Rails.cache.write('rownd_user', data, expires_in: 1.minute)
45
+ session.delete(:rownd_stale_data) if session[:rownd_stale_data]
46
+ return data
47
+ end
48
+
49
+ Rails.cache.fetch('rownd_user', expires_in: 1.minute) do
50
+ fetch_user_from_api
51
+ end
52
+ end
53
+
54
+ def fetch_user_from_api
55
+ response = ::Devise::Rownd::API.make_api_call(
56
+ "/me/applications/#{@app_id}/data",
57
+ {
58
+ method: 'GET',
59
+ headers: { 'Authorization' => "Bearer #{@access_token}" }
60
+ }
61
+ )
62
+ return response.body['data'] if response.success?
63
+
64
+ raise StandardError, response.body['message']
65
+ end
66
+
67
+ def verify_token(access_token)
68
+ for jwk in jwks
69
+ begin
70
+ response = JOSE::JWT.verify_strict(jwk, ['EdDSA'], access_token)
71
+ return response[1].fields if response[0]
72
+ rescue StandardError => e
73
+ puts "Error: #{e}"
74
+ next
75
+ end
76
+ raise StandardError
77
+ end
78
+ end
79
+
80
+ def jwks
81
+ Rails.cache.fetch('rownd_jwks', expires_in: 15.minutes) do
82
+ fetch_jwks
83
+ end
84
+ end
85
+
86
+ def fetch_jwks
87
+ response = ::Devise::Rownd::API.make_api_call('/hub/auth/keys')
88
+ response.body['keys']
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ Warden::Strategies.add(:rownd_authenticatable, Devise::Strategies::RowndAuthenticatable)
95
+ Devise.add_module :rownd_authenticatable, :strategy => true
@@ -0,0 +1 @@
1
+ require 'devise/rownd/strategies/rownd_authenticatable'
@@ -0,0 +1,16 @@
1
+ module Devise
2
+ module Rownd
3
+ class User
4
+ attr_reader :data
5
+
6
+ def initialize(data)
7
+ @data = data
8
+ Devise::Rownd.app_schema.each do |key, _value|
9
+ self.class.send :attr_accessor, key
10
+ instance_variable_value = data.is_a?(Hash) && data.key?(key) ? data[key] : nil
11
+ instance_variable_set("@#{key}", instance_variable_value)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ module Devise
2
+ module Rownd
3
+ VERSION = '1.0.0'
4
+ end
5
+ end
@@ -0,0 +1,16 @@
1
+ require 'devise/rownd/version'
2
+ require 'devise/rownd/engine'
3
+ require 'devise/rownd/strategies'
4
+ require 'devise/rownd/models'
5
+ require 'devise/rownd/api'
6
+ require 'devise/rownd/user'
7
+
8
+ module Devise
9
+ module Rownd
10
+ end
11
+ end
12
+
13
+ require_relative '../../config/config'
14
+ require_relative '../../config/initializers/app_creds'
15
+ require_relative '../../config/initializers/app_config'
16
+ # require_relative '../../config/initializers/devise'
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :devise_rownd do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,229 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: devise-rownd
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Bobby Radford
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-04-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: devise
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: faraday_middleware
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.2.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.2.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: rbnacl
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 7.1.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 7.1.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: jose
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.1.3
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.1.3
83
+ - !ruby/object:Gem::Dependency
84
+ name: rails
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 6.1.5
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 6.1.5
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 13.0.6
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 13.0.6
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 1.26.1
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 1.26.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop-performance
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 1.13.3
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 1.13.3
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop-rake
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 0.6.0
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 0.6.0
153
+ - !ruby/object:Gem::Dependency
154
+ name: rubocop-rspec
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: 2.9.0
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: 2.9.0
167
+ description: A Devise extension for authenticating with Rownd
168
+ email:
169
+ - bobby@rownd.io
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - MIT-LICENSE
175
+ - README.md
176
+ - Rakefile
177
+ - app/assets/config/devise_rownd_manifest.js
178
+ - app/assets/stylesheets/devise/rownd/application.css
179
+ - app/controllers/devise/rownd/application_controller.rb
180
+ - app/controllers/devise/rownd/auth_controller.rb
181
+ - app/helpers/devise/rownd/application_helper.rb
182
+ - app/helpers/devise/rownd/auth_helper.rb
183
+ - app/jobs/devise/rownd/application_job.rb
184
+ - app/mailers/devise/rownd/application_mailer.rb
185
+ - app/models/devise/rownd/application_record.rb
186
+ - app/views/devise/rownd/_signin.html.erb
187
+ - app/views/devise/sessions/new.html.erb
188
+ - config/config.rb
189
+ - config/initializers/app_config.rb
190
+ - config/initializers/app_creds.rb
191
+ - config/routes.rb
192
+ - lib/devise/rownd.rb
193
+ - lib/devise/rownd/api.rb
194
+ - lib/devise/rownd/custom_failure.rb
195
+ - lib/devise/rownd/engine.rb
196
+ - lib/devise/rownd/models.rb
197
+ - lib/devise/rownd/models/rownd_authenticatable.rb
198
+ - lib/devise/rownd/strategies.rb
199
+ - lib/devise/rownd/strategies/rownd_authenticatable.rb
200
+ - lib/devise/rownd/user.rb
201
+ - lib/devise/rownd/version.rb
202
+ - lib/tasks/devise/rownd_tasks.rake
203
+ homepage: https://github.com/rownd/devise-rownd
204
+ licenses:
205
+ - MIT
206
+ metadata:
207
+ homepage_uri: https://github.com/rownd/devise-rownd
208
+ source_code_uri: https://github.com/rownd/devise-rownd
209
+ changelog_uri: https://github.com/rownd/devise-rownd/CHANGELOG.md
210
+ post_install_message:
211
+ rdoc_options: []
212
+ require_paths:
213
+ - lib
214
+ required_ruby_version: !ruby/object:Gem::Requirement
215
+ requirements:
216
+ - - ">="
217
+ - !ruby/object:Gem::Version
218
+ version: 2.6.5
219
+ required_rubygems_version: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - ">="
222
+ - !ruby/object:Gem::Version
223
+ version: 3.0.3
224
+ requirements: []
225
+ rubygems_version: 3.0.3
226
+ signing_key:
227
+ specification_version: 4
228
+ summary: Rownd Authentication for Devise
229
+ test_files: []