authorio 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +99 -0
  4. data/Rakefile +20 -0
  5. data/app/assets/config/authorio_manifest.js +1 -0
  6. data/app/assets/stylesheets/authorio/application.css +15 -0
  7. data/app/assets/stylesheets/authorio/auth.css +41 -0
  8. data/app/controllers/authorio/application_controller.rb +4 -0
  9. data/app/controllers/authorio/auth_controller.rb +134 -0
  10. data/app/controllers/authorio/helpers.rb +17 -0
  11. data/app/helpers/authorio/application_helper.rb +4 -0
  12. data/app/helpers/authorio/test_helper.rb +4 -0
  13. data/app/jobs/authorio/application_job.rb +4 -0
  14. data/app/models/authorio/application_record.rb +5 -0
  15. data/app/models/authorio/request.rb +7 -0
  16. data/app/models/authorio/token.rb +8 -0
  17. data/app/models/authorio/user.rb +5 -0
  18. data/app/views/authorio/auth/authorization_interface.html.erb +37 -0
  19. data/app/views/layouts/authorio/application.html.erb +15 -0
  20. data/config/routes.rb +7 -0
  21. data/db/migrate/20210627230156_create_authorio_users.rb +11 -0
  22. data/db/migrate/20210627230416_create_authorio_requests.rb +13 -0
  23. data/db/migrate/20210707230416_create_authorio_tokens.rb +13 -0
  24. data/lib/authorio.rb +27 -0
  25. data/lib/authorio/configuration.rb +12 -0
  26. data/lib/authorio/engine.rb +14 -0
  27. data/lib/authorio/exceptions.rb +5 -0
  28. data/lib/authorio/routes.rb +9 -0
  29. data/lib/authorio/version.rb +3 -0
  30. data/lib/generators/authorio/install/install_generator.rb +17 -0
  31. data/lib/generators/authorio/install/templates/authorio.rb +15 -0
  32. data/lib/tasks/authorio_tasks.rake +18 -0
  33. metadata +166 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9a376e3f8c81fdc53ac6c223c42fedadb43cdc02129713ca6756db1506c07f10
4
+ data.tar.gz: 761c806afafae95a35e97e97b784ae4271cc09fb7cbb6eb6001571e9319cc6a2
5
+ SHA512:
6
+ metadata.gz: 32c86c4be9a8cf949ba616797d0a7b505213687d09435ae7c8e0a5588224076c73b0aab4e7b985af74baa89963dafabdc2db7f562982165886dc8085e2fd88c7
7
+ data.tar.gz: c9bbaf3bce9c291ddf5619a62caa03962d31c1e57abf0fe45baae96d2325cbd1f0d46f1d6c5477fb9cef6dafa9eb54f4ee2874820e8e74b662dd7e8c9d6aa77d
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2021 Michael Meckler
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,99 @@
1
+ # Authorio
2
+ The Authorio plugin turns any Rails-based site into an authentication endpoint for Indieauth.
3
+
4
+ ## Motivation
5
+ [IndieAuth](https://indieauth.com/faq) is an authentication protocol that allows you to sign in to a website using a domain name (assuming the web site supports IndieAuth). There are two servers involved in the transaction: the *client*, which is where you're logging in to (authenticating with), and the *authentication endpoint*, which verifies you are who you say you are.
6
+
7
+ There are several implementations for IndieAuth clients, if you want to support IndieAuth login on your site. But there aren't many useful implementations of the authentication endpoint. Many people work around this by using an IndieAuth service, such as [RelMeAuth](https://indieweb.org/RelMeAuth) which delegates authentication to a third-party site such as Twitter or Facebook.
8
+
9
+ Authorio allows you to create a truly federated authentication setup, using your own Rails site. By adding Authorio to your site, you can remove any external authentication dependencies and log in using only servies you control.
10
+
11
+ ## Installation
12
+
13
+ ### 1. Add the Authorio Gem to your bundle
14
+ Add this line to your application's Gemfile:
15
+
16
+ ```ruby
17
+ gem 'authorio'
18
+ ```
19
+
20
+ And then execute:
21
+ ```bash
22
+ $ bundle
23
+ ```
24
+
25
+ ### 2. Install Authorio config files
26
+ ```bash
27
+ $ rails generate authorio:install
28
+ ```
29
+
30
+ ### 3. Install Authorio migrations
31
+ Authorio needs to add a couple tables to your app's database in order to store (hashed) passwords and access tokens.
32
+ You will need to install the migrations and then run them to add these tables
33
+ ```bash
34
+ $ rails authorio:install:migrations
35
+ Copied migration 20210703002653_create_authorio_users.authorio.rb from authorio
36
+ Copied migration 20210703002654_create_authorio_requests.authorio.rb from authorio
37
+ $ rails db:migrate
38
+ ...
39
+ == 20210703002653 CreateAuthorioUsers: migrated (0.0038s) =====================
40
+ ...
41
+ == 20210703002654 CreateAuthorioRequests: migrated (0.0041s) ==================
42
+ ```
43
+
44
+ ### 4. Install Authorio routes
45
+ Add the following line somewhere inside the `Rails.application.routes.draw do` block in your `config/routes.rb` file
46
+ ```ruby
47
+ authorio_routes
48
+ ```
49
+
50
+ ### 5. Add the Indieauth tags
51
+ Somewhere on your home page, add the following to your view template:
52
+ ```erb
53
+ <%= indieauth_tag %>
54
+ ```
55
+
56
+ This part of the protocol will tell the IndieAuth client where to redirect for authentication. Note that ideally
57
+ you should only place this tag on your home page, and not in a layout that will put it on every page on your site.
58
+ (It won't hurt anything but it's redundant to have it in multiple locations)
59
+
60
+ ### 6. Set your initial password
61
+ By default, Authorio uses a simple password to authenticate you. This password is hashed and stored in your app
62
+ database, which presumably you control.
63
+
64
+ You are free to customize Authorio to change its authentication scheme however you want, but to get started
65
+ quickly you'll want to set up a password for yourself.
66
+
67
+ ```bash
68
+ $ rake authorio:password
69
+
70
+ Enter new password:
71
+ Confirm password:
72
+ Password set
73
+ ```
74
+
75
+ ### 7. Precompile assets
76
+
77
+ Authorio has some of its own assets which, if you're running in a production environment, will need to be precompiled
78
+ like your existing assets. Re-run your normal precompilation step to ensure Authorio's assets are in your asset pipeline
79
+ ```bash
80
+ $ rails assets:precompile
81
+ ```
82
+ Now restart your rails app, and you should be all set!
83
+
84
+ ## Usage
85
+
86
+ To test your authentication endpoint, find an IndieAuth client you can log in to. A simple test is at [Pin13](pin13.net/login). Enter your site's URL and click Sign In.
87
+
88
+ You should be then be redirected back to your own site and the Authorio
89
+ login UI
90
+ <img src="./auth-ui.png" width="400">
91
+
92
+ Enter the password you set up when you installed Authorio. This should redirect you back to the client where you
93
+ will be logged in!
94
+
95
+ ## Contributing
96
+ Send pull requests to [Authorio on GitHub](https://github.com/reiterate-app/authorio)
97
+
98
+ ## License
99
+ 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,20 @@
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
+ load "lib/tasks/authorio_tasks.rake"
9
+
10
+ require "bundler/gem_tasks"
11
+
12
+ require "rake/testtask"
13
+
14
+ Rake::TestTask.new(:test) do |t|
15
+ t.libs << 'test'
16
+ t.pattern = 'test/**/*_test.rb'
17
+ t.verbose = false
18
+ end
19
+
20
+ task default: :test
@@ -0,0 +1 @@
1
+ //= link_directory ../stylesheets/authorio .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,41 @@
1
+ div.authorio-auth {
2
+ padding-top: 200px;
3
+ }
4
+
5
+ .authorio-auth h3 {
6
+ text-align: center;
7
+ }
8
+
9
+ .authorio-auth .client-row {
10
+ text-align: center;
11
+ color: darkolivegreen;
12
+ margin-top: -0.5em;
13
+ }
14
+
15
+ .authorio-auth span.client {
16
+ font-weight: bold;
17
+ }
18
+
19
+ .auth-panel {
20
+ background-color: gainsboro;
21
+ border-bottom: 2px solid darkgray;
22
+ padding-bottom: 3em;
23
+ }
24
+
25
+ .authorio-auth label {
26
+ display: block;
27
+ margin-left: 1.2em;
28
+ }
29
+
30
+ .authorio-auth input {
31
+ margin: 0 1em 1em 1em;
32
+ width: 90%;
33
+ }
34
+
35
+ .authorio-auth form {
36
+ margin-top: 2em;
37
+ }
38
+
39
+ .authorio-auth input.btn {
40
+ margin-top: 2em;
41
+ }
@@ -0,0 +1,4 @@
1
+ module Authorio
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,134 @@
1
+ module Authorio
2
+ class AuthController < ActionController::Base
3
+ require 'uri'
4
+ require 'digest'
5
+
6
+ protect_from_forgery except: [:send_profile, :issue_token, :authorize_user]
7
+
8
+ def authorization_interface
9
+ p = auth_req_params
10
+
11
+ path = if p[:me]
12
+ URI(p[:me]).path
13
+ else
14
+ '/'
15
+ end
16
+
17
+ user = User.find_by! profile_path: path
18
+ @user_url = p[:me] || user_url(user)
19
+
20
+ # If there are any old requests from this (client, user), delete them now
21
+ Request.where(authorio_user: user, client: p[:client_id]).delete_all
22
+
23
+ auth_request = Request.new.tap do |req|
24
+ req.code = SecureRandom.hex(20)
25
+ req.redirect_uri = p[:redirect_uri]
26
+ req.client = p[:client_id] # IndieAuth client_id conflicts with Rails' _id foreign key convention
27
+ req.scope = p[:scope]
28
+ req.authorio_user = user
29
+ end
30
+ auth_request.save
31
+ session[:state] = p[:state]
32
+ session[:code_challenge] = p[:code_challenge]
33
+ end
34
+
35
+ def authorize_user
36
+ p = auth_user_params
37
+ user = User.find_by! profile_path: URI(p[:url]).path
38
+ auth_req = Request.find_by! client: p[:client], authorio_user: user
39
+ if user.authenticate(p[:password])
40
+ params = { code: auth_req.code, state: session[:state] }
41
+ redirect_to "#{auth_req.redirect_uri}?#{params.to_query}"
42
+ else
43
+ flash.now[:alert] = "Incorrect password. Try again."
44
+ redirect_back fallback_location: Authorio.authorization_path, allow_other_host: false
45
+ end
46
+ end
47
+
48
+ def send_profile
49
+ begin
50
+ render json: { 'me': user_url(validate_request.authorio_user) }
51
+ rescue Authorio::Exceptions::InvalidGrant
52
+ render invalid_grant
53
+ end
54
+ end
55
+
56
+ def issue_token
57
+ begin
58
+ req = validate_request
59
+ raise Authorio::Exceptions::InvalidGrant.new if req.scope.blank?
60
+ token = Token.create(authorio_user: req.authorio_user, scope: req.scope, client: req.client)
61
+ render json: {
62
+ 'me': user_url(req.authorio_user),
63
+ 'access_token': token.auth_token,
64
+ 'scope': req.scope,
65
+ 'token_type': 'Bearer'
66
+ }
67
+ rescue Authorio::Exceptions::InvalidGrant
68
+ render invalid_grant
69
+ end
70
+ end
71
+
72
+ def verify_token
73
+ token = Token.find_by auth_token: bearer_token
74
+ head :bad_request and return if token.nil?
75
+ render json: {
76
+ 'me': user_url(token.authorio_user),
77
+ 'client_id': token.client,
78
+ 'scope': 'token.scope'
79
+ }
80
+ end
81
+
82
+ private
83
+
84
+ def auth_req_params
85
+ %w(client_id redirect_uri state code_challenge).each do |param|
86
+ unless params.key?(param) && !params[param].empty?
87
+ raise ::ActionController::ParameterMissing.new(param)
88
+ end
89
+ end
90
+ params.permit(:response_type, :code_challenge, :code_challenge_method, :scope, :me, :redirect_uri, :client_id, :state)
91
+ end
92
+
93
+ def auth_user_params
94
+ params.permit(:password, :url, :client)
95
+ end
96
+
97
+ def user_url(user)
98
+ "#{request.scheme}://#{request.host}#{user.profile_path}"
99
+ end
100
+
101
+ def invalid_grant
102
+ { json: { 'error': 'invalid_grant' }, status: :bad_request }
103
+ end
104
+
105
+ def code_challenge_failed?
106
+ # For now, if original request did not have code challenge, then we pass by default
107
+ return false if session[:code_challenge].nil?
108
+ sha256 = Digest::SHA256.hexdigest params[:code_verifier]
109
+ base64 = Base64.urlsafe_encode64 sha256
110
+ return base64 != session[:code_challenge]
111
+ end
112
+
113
+ def invalid_request?(req)
114
+ req.redirect_uri != params[:redirect_uri] \
115
+ || req.client != params[:client_id] \
116
+ || req.created_at < Time.now - 10.minutes
117
+ end
118
+
119
+ def validate_request
120
+ req = Request.find_by code: params[:code]
121
+ raise Authorio::Exceptions::InvalidGrant.new if req.nil?
122
+ req.delete
123
+ raise Authorio::Exceptions::InvalidGrant.new if invalid_request?(req) || code_challenge_failed?
124
+ req
125
+ end
126
+
127
+ def bearer_token
128
+ bearer = /^Bearer /
129
+ header = request.headers['Authorization']
130
+ header.gsub(bearer, '') if header && header.match(bearer)
131
+ end
132
+
133
+ end
134
+ end
@@ -0,0 +1,17 @@
1
+ module Authorio
2
+ # These helpers are provided to the main application
3
+ module Helpers
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ if respond_to?(:helper_method)
8
+ helper_method :indieauth_tag
9
+ end
10
+ end
11
+
12
+ def indieauth_tag
13
+ %Q[<link rel="authorization_endpoint" href="#{URI.join(root_url, Authorio.authorization_path)}">
14
+ <link rel="token_endpoint" href="#{URI.join(root_url, Authorio.token_path)}">].html_safe
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,4 @@
1
+ module Authorio
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Authorio
2
+ module TestHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Authorio
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,5 @@
1
+ module Authorio
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ module Authorio
2
+ class Request < ApplicationRecord
3
+ belongs_to :authorio_user, class_name: "::Authorio::User"
4
+
5
+ validates_presence_of :code, :redirect_uri, :client
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ module Authorio
2
+ class Token < ApplicationRecord
3
+ belongs_to :authorio_user, class_name: "::Authorio::User"
4
+ has_secure_token :auth_token
5
+
6
+ validates_presence_of :scope, :client
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ module Authorio
2
+ class User < ApplicationRecord
3
+ has_secure_password
4
+ end
5
+ end
@@ -0,0 +1,37 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-GB">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Authorio Login</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <link rel="stylesheet"
8
+ href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
9
+ integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
10
+ crossorigin="anonymous">
11
+ <%= stylesheet_link_tag "authorio/auth" %>
12
+ </head>
13
+ <body>
14
+ <div class="container authorio-auth">
15
+ <div class="row">
16
+ <div class="col-md-4">
17
+ </div>
18
+ <div class="col-md-4 auth-panel">
19
+ <h3>Authorio</h3>
20
+ <div class="client-row">
21
+ Authenticating with <span class="client"><%= params[:client_id] %>
22
+ </div>
23
+ <%= form_with(url: "authorize_user", method: :post) do |form| %>
24
+ <%= form.label(:url, "User URL") %>
25
+ <%= form.text_field(:url, value: @user_url, readonly: true) %>
26
+ <%= form.label(:password, "Password") %>
27
+ <%= form.password_field(:password) %>
28
+ <%= form.hidden_field(:client, value: params[:client_id]) %>
29
+ <%= form.submit("Sign in", class: 'btn btn-success') %>
30
+ <% end %>
31
+ </div>
32
+ <div class="col-md-4">
33
+ </div>
34
+ </div>
35
+ </div>
36
+ </body>
37
+ </html>
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Authorio</title>
5
+ <%= csrf_meta_tags %>
6
+ <%= csp_meta_tag %>
7
+
8
+ <%= stylesheet_link_tag "authorio/application", media: "all" %>
9
+ </head>
10
+ <body>
11
+
12
+ <%= yield %>
13
+
14
+ </body>
15
+ </html>
data/config/routes.rb ADDED
@@ -0,0 +1,7 @@
1
+ Authorio::Engine.routes.draw do
2
+ get Authorio.configuration.authorization_endpoint, controller: 'auth', action: 'authorization_interface'
3
+ post Authorio.configuration.authorization_endpoint, controller: 'auth', action: 'send_profile'
4
+ post '/authorize_user', controller: 'auth', action: 'authorize_user'
5
+ get Authorio.configuration.token_endpoint, controller: 'auth', action: 'verify_token'
6
+ post Authorio.configuration.token_endpoint, controller: 'auth', action: 'issue_token'
7
+ end
@@ -0,0 +1,11 @@
1
+ class CreateAuthorioUsers < ActiveRecord::Migration[6.1]
2
+ def change
3
+ create_table :authorio_users do |t|
4
+ t.string :profile_path
5
+ t.string :password_digest
6
+
7
+ t.timestamps
8
+ end
9
+ add_index :authorio_users, :profile_path, unique: true
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ class CreateAuthorioRequests < ActiveRecord::Migration[6.1]
2
+ def change
3
+ create_table :authorio_requests do |t|
4
+ t.string :code
5
+ t.string :redirect_uri
6
+ t.string :client
7
+ t.string :scope
8
+ t.references :authorio_user, null: false, foreign_key: true
9
+
10
+ t.timestamps
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ class CreateAuthorioTokens < ActiveRecord::Migration[6.1]
2
+ def change
3
+ create_table :authorio_tokens do |t|
4
+ t.string :client
5
+ t.string :scope
6
+ t.references :authorio_user, null: false, foreign_key: true
7
+ t.string :auth_token
8
+
9
+ t.timestamps
10
+ end
11
+ add_index :authorio_tokens, :auth_token, unique: true
12
+ end
13
+ end
data/lib/authorio.rb ADDED
@@ -0,0 +1,27 @@
1
+ require "authorio/version"
2
+ require "authorio/engine"
3
+ require "authorio/configuration"
4
+ require "authorio/routes"
5
+ require "authorio/exceptions"
6
+
7
+ module Authorio
8
+ class << self
9
+ attr_accessor :configuration, :authorization_path
10
+ end
11
+
12
+ def self.configuration
13
+ @configuration ||= Configuration.new
14
+ end
15
+
16
+ def self.configure
17
+ yield configuration
18
+ end
19
+
20
+ def self.authorization_path
21
+ return [Authorio.configuration.mount_point, Authorio.configuration.authorization_endpoint].join("/")
22
+ end
23
+
24
+ def self.token_path
25
+ return [Authorio.configuration.mount_point, Authorio.configuration.token_endpoint].join("/")
26
+ end
27
+ end
@@ -0,0 +1,12 @@
1
+ module Authorio
2
+ class Configuration
3
+
4
+ attr_accessor :authorization_endpoint, :token_endpoint, :mount_point
5
+
6
+ def initialize
7
+ @authorization_endpoint = "auth"
8
+ @token_endpoint = "token"
9
+ @mount_point = "authorio"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ module Authorio
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Authorio
4
+
5
+ initializer "authorio.load_helpers" do |app|
6
+ ActionController::Base.send :include, Authorio::Helpers
7
+ end
8
+
9
+ initializer "authorio.assets.precompile" do |app|
10
+ app.config.assets.precompile += %w( authorio/auth.css )
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ module Authorio
2
+ module Exceptions
3
+ class InvalidGrant < RuntimeError; end
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ module ActionDispatch::Routing
2
+ class Mapper
3
+
4
+ # Provide a custom mounting command, just so we can track our own mount point
5
+ def authorio_routes
6
+ mount Authorio::Engine, at: Authorio.configuration.mount_point
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ module Authorio
2
+ VERSION = '0.8.0'
3
+ end
@@ -0,0 +1,17 @@
1
+ module Authorio
2
+ class InstallGenerator < Rails::Generators::Base
3
+
4
+ def self.source_paths
5
+ paths = []
6
+ paths << File.expand_path('../templates', "../../#{__FILE__}")
7
+ paths << File.expand_path('../templates', "../#{__FILE__}")
8
+ paths << File.expand_path('../templates', __FILE__)
9
+ paths.flatten
10
+ end
11
+
12
+ def add_files
13
+ template 'authorio.rb', 'config/initializers/authorio.rb'
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ # Configuration for Authorio IndieAuth authentication
2
+
3
+ Authorio.configure do |config|
4
+
5
+ # Mount point for Authorio URLs. Typically you would call this in your routes.rb
6
+ # as mount Authorio::Engine, at: mount_point
7
+ # But Authorio needs to know its own mount point, so we define it here and use a custom mount command in the config
8
+ # config.mount_point = "authorio"
9
+
10
+ # The path where clients will be redirected to provide authentication
11
+ # config.authorization_endpoint = "auth"
12
+
13
+ # The path for token requests
14
+ # config.token_endpoint = "token"
15
+ end
@@ -0,0 +1,18 @@
1
+ namespace :authorio do
2
+ desc "Set password for initial Authorio user"
3
+ require 'io/console'
4
+
5
+ def input_no_echo(prompt)
6
+ print("\n#{prompt}")
7
+ STDIN.noecho(&:gets).chop
8
+ end
9
+
10
+ task :password => :environment do
11
+ passwd = input_no_echo("Enter new password: ")
12
+ passwd_confirm = input_no_echo("Confirm password: ")
13
+ user = Authorio::User.
14
+ create_with(password: passwd, password_confirmation:passwd_confirm).
15
+ find_or_create_by!(profile_path: '/')
16
+ puts("\nPassword set")
17
+ end
18
+ end
metadata ADDED
@@ -0,0 +1,166 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: authorio
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.0
5
+ platform: ruby
6
+ authors:
7
+ - Michael Meckler
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-07-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 6.1.3
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 6.1.3.2
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: 6.1.3
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 6.1.3.2
33
+ - !ruby/object:Gem::Dependency
34
+ name: bcrypt
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: factory_bot_rails
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rspec
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rspec-rails
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: byebug
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ description: Rails engine to add IndieAuth authentication endpoiont functionality
104
+ email:
105
+ - rattroupe@reiterate-app.com
106
+ executables: []
107
+ extensions: []
108
+ extra_rdoc_files: []
109
+ files:
110
+ - MIT-LICENSE
111
+ - README.md
112
+ - Rakefile
113
+ - app/assets/config/authorio_manifest.js
114
+ - app/assets/stylesheets/authorio/application.css
115
+ - app/assets/stylesheets/authorio/auth.css
116
+ - app/controllers/authorio/application_controller.rb
117
+ - app/controllers/authorio/auth_controller.rb
118
+ - app/controllers/authorio/helpers.rb
119
+ - app/helpers/authorio/application_helper.rb
120
+ - app/helpers/authorio/test_helper.rb
121
+ - app/jobs/authorio/application_job.rb
122
+ - app/models/authorio/application_record.rb
123
+ - app/models/authorio/request.rb
124
+ - app/models/authorio/token.rb
125
+ - app/models/authorio/user.rb
126
+ - app/views/authorio/auth/authorization_interface.html.erb
127
+ - app/views/layouts/authorio/application.html.erb
128
+ - config/routes.rb
129
+ - db/migrate/20210627230156_create_authorio_users.rb
130
+ - db/migrate/20210627230416_create_authorio_requests.rb
131
+ - db/migrate/20210707230416_create_authorio_tokens.rb
132
+ - lib/authorio.rb
133
+ - lib/authorio/configuration.rb
134
+ - lib/authorio/engine.rb
135
+ - lib/authorio/exceptions.rb
136
+ - lib/authorio/routes.rb
137
+ - lib/authorio/version.rb
138
+ - lib/generators/authorio/install/install_generator.rb
139
+ - lib/generators/authorio/install/templates/authorio.rb
140
+ - lib/tasks/authorio_tasks.rake
141
+ homepage: https://rubygems.org/gems/authorio
142
+ licenses:
143
+ - MIT
144
+ metadata:
145
+ homepage_uri: https://rubygems.org/gems/authorio
146
+ source_code_uri: https://github.com/reiterate-app/authorio
147
+ post_install_message:
148
+ rdoc_options: []
149
+ require_paths:
150
+ - lib
151
+ required_ruby_version: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ required_rubygems_version: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ requirements: []
162
+ rubygems_version: 3.2.11
163
+ signing_key:
164
+ specification_version: 4
165
+ summary: Indieauth Authentication endpoint for Rails
166
+ test_files: []