authorio 0.8.2 → 0.8.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b69bae6ee41c0e027922f5bc07b2bc61c72c86026a8e42eee97366453858af43
4
- data.tar.gz: 496cb0ada5d2802e789b34e28ed21dc320b4ce76c9b9036b705ea8f7219efa8a
3
+ metadata.gz: a5ecd8cf849002e116b21a3c4f0073fc17988e62791f356ab57a703397edc77c
4
+ data.tar.gz: 4c0c4908c722b65ccd1559b5fea382231933e2840e5d0b6e08271ed5efd43f15
5
5
  SHA512:
6
- metadata.gz: 9a361fbec959948621257d111de2af8256fc23fee38be56660c66b5b68b8f80972660317ac06d997c93cd28b62406387089a67110894d09acdf34d60e2b8635c
7
- data.tar.gz: a887161dd53aedea2527d1678db6fc6cd7c7d22aff6631442cde63d61d4f6093f29c08bcab8ef20c278d255e247eb5fcb8c5be549ced931f81ac2954e8d1c7fe
6
+ metadata.gz: 8bb01ec581f584fe9eadc7d77d477fa2f57e8883101ba51b5f8cb8729bf7486f061bc996a17cab023d476119dda8f37d7676a7f04e281180ad8dda8e649eb16c
7
+ data.tar.gz: 7d8e0e19113cd7748a64212ee98f514ba953027409adf20a71b47f14c3e1c5ef0db28924bca9afa4fd498ea56a686b1169f2f8ceb7f53297472c6b9cd34d86cf
data/README.md CHANGED
@@ -136,6 +136,10 @@ on a public-access computer. Default is *nil* (disabled)
136
136
  - [ ] Customizing the authentication view/UI
137
137
  - [ ] Customizing the authentication method
138
138
 
139
+ ## User Profile
140
+
141
+ You can set up your <a href="doc/profile.md">user profile</a> which can be sent to authenticating clients.
142
+
139
143
  ## Contributing
140
144
  Send pull requests to [Authorio on GitHub](https://github.com/reiterate-app/authorio)
141
145
 
@@ -61,3 +61,35 @@ span.r-m {
61
61
  label.remember {
62
62
  margin-top: -1em;
63
63
  }
64
+
65
+ div.scopes {
66
+ margin-top: -1.5em;
67
+ }
68
+
69
+ ul.scope {
70
+ list-style: none;
71
+ padding-left: 20px;
72
+ }
73
+
74
+ ul.scope li label {
75
+ font-weight: normal;
76
+ }
77
+
78
+ div.topbar {
79
+ border-bottom: 1px solid darkgray;
80
+ }
81
+
82
+ div.topbar li {
83
+ display: inline-block;
84
+ padding: 12px;
85
+ }
86
+
87
+ div.topbar ul {
88
+ margin: 0 10px;
89
+ padding: 0;
90
+ text-align: right;
91
+ }
92
+
93
+ div.topbar li:first-child {
94
+ float: left;
95
+ }
@@ -1,8 +1,7 @@
1
1
  module Authorio
2
- class AuthController < ActionController::Base
2
+ class AuthController < AuthorioController
3
3
  require 'uri'
4
4
  require 'digest'
5
- layout 'authorio/main'
6
5
 
7
6
  # These API-only endpoints are protected by code challenge and do not need CSRF protextion
8
7
  protect_from_forgery with: :exception, except: [:send_profile, :issue_token]
@@ -13,51 +12,45 @@ module Authorio
13
12
  Authorio::Session.where(user: exception.session.user).delete_all
14
13
  end
15
14
 
15
+ helper_method :user_scope_description
16
+
17
+ # GET /auth
16
18
  def authorization_interface
17
- p = auth_req_params
18
- p[:me] ||= "#{host_with_protocol}/"
19
- @user = User.find_by! profile_path: URI(p[:me]).path
19
+ %w(client_id redirect_uri state code_challenge).each do |param|
20
+ raise ::ActionController::ParameterMissing, param unless params[param].present?
21
+ end
22
+ @user = User.find_by_url! params[:me]
20
23
 
21
24
  # If there are any old requests from this (client, user), delete them now
22
- Request.where(authorio_user: @user, client: p[:client_id]).delete_all
23
-
24
- auth_request = Request.new.tap do |req|
25
- req.code = SecureRandom.hex(20)
26
- req.redirect_uri = p[:redirect_uri]
27
- req.client = p[:client_id] # IndieAuth client_id conflicts with Rails' _id foreign key convention
28
- req.scope = p[:scope]
29
- req.authorio_user = @user
30
- end
31
- auth_request.save
32
- session[:state] = p[:state]
33
- session[:code_challenge] = p[:code_challenge]
34
- session[:client_id] = p[:client_id]
35
- @user_logged_in_locally = !user_session.nil?
25
+ Request.where(authorio_user: @user, client: params[:client_id]).delete_all
26
+
27
+ auth_request = Request.create(
28
+ code: SecureRandom.hex(20),
29
+ redirect_uri: params[:redirect_uri],
30
+ client: params[:client_id], # IndieAuth client_id conflicts with Rails' _id foreign key convention
31
+ scope: params[:scope],
32
+ authorio_user: @user
33
+ )
34
+ session.update request.parameters.slice(*%w(state client_id code_challenge))
36
35
  @rememberable = Authorio.configuration.local_session_lifetime && !@user_logged_in_locally
37
-
36
+ @scope = params[:scope]&.split
38
37
  rescue ActiveRecord::RecordNotFound
39
38
  redirect_back_with_error "Invalid user"
39
+ rescue ActionController::ParameterMissing => error
40
+ render oauth_error "invalid_request", "missing parameter #{error}"
40
41
  end
41
42
 
43
+ # POST /user/:id/authorize
42
44
  def authorize_user
43
- p = auth_user_params
44
-
45
- if params[:commit] == "Cancel"
46
- redirect_to session[:client_id] and return
47
- end
45
+ redirect_to session[:client_id] and return if params[:commit] == "Cancel"
48
46
 
49
47
  user = authenticate_user_from_session_or_password
50
- if p[:remember_me]
51
- cookies.encrypted[:user] = {
52
- value: Authorio::Session.create(authorio_user: user).as_cookie,
53
- expires: Authorio.configuration.local_session_lifetime
54
- }
55
- end
48
+ set_session_cookie(user) if auth_user_params[:remember_me]
56
49
 
57
50
  auth_req = Request.find_by! client: session[:client_id], authorio_user: user
58
- params = { code: auth_req.code, state: session[:state] }
59
- redirect_to "#{auth_req.redirect_uri}?#{params.to_query}"
60
-
51
+ auth_req.update_scope(scope_params[:scope]) if params.has_key? :scope
52
+ redirect_params = { code: auth_req.code, state: session[:state] }
53
+ redirect_to "#{auth_req.redirect_uri}?#{redirect_params.to_query}"
61
54
  rescue ActiveRecord::RecordNotFound
62
55
  redirect_back_with_error "Invalid user"
63
56
  rescue Authorio::Exceptions::InvalidPassword
@@ -65,24 +58,24 @@ module Authorio
65
58
  end
66
59
 
67
60
  def send_profile
68
- render json: { 'me': user_url(validate_request.authorio_user) }
69
- rescue Authorio::Exceptions::InvalidGrant
70
- render invalid_grant
61
+ request = validate_request
62
+ render json: profile(request)
63
+ rescue Authorio::Exceptions::InvalidGrant => error
64
+ render oauth_error 'invalid_grant', error.message
71
65
  end
72
66
 
73
67
  def issue_token
74
68
  req = validate_request
75
- raise Authorio::Exceptions::InvalidGrant.new if req.scope.blank?
69
+ raise Authorio::Exceptions::InvalidGrant, 'missing scope' if req.scope.blank?
76
70
  token = Token.create(authorio_user: req.authorio_user, scope: req.scope, client: req.client)
77
71
  render json: {
78
- 'me': user_url(req.authorio_user),
79
72
  'access_token': token.auth_token,
80
73
  'scope': req.scope,
81
74
  'expires_in': Authorio.configuration.token_expiration,
82
75
  'token_type': 'Bearer'
83
- }
84
- rescue Authorio::Exceptions::InvalidGrant
85
- render invalid_grant
76
+ }.merge(profile(req))
77
+ rescue Authorio::Exceptions::InvalidGrant => error
78
+ render oauth_error, 'invalid_grant', error.message
86
79
  end
87
80
 
88
81
  def verify_token
@@ -103,29 +96,14 @@ module Authorio
103
96
 
104
97
  private
105
98
 
106
- def auth_req_params
107
- %w(client_id redirect_uri state code_challenge).each do |param|
108
- unless params.key?(param) && !params[param].empty?
109
- raise ::ActionController::ParameterMissing.new(param)
110
- end
111
- end
112
- params.permit(:response_type, :code_challenge, :code_challenge_method, :scope, :me, :redirect_uri, :client_id, :state)
113
- end
114
-
115
- def auth_user_params
116
- params.require(:user).permit(:password, :url, :remember_me)
99
+ def scope_params
100
+ params.require(:scope).permit(scope: [])
117
101
  end
118
102
 
119
- def host_with_protocol
120
- "#{request.scheme}://#{request.host}"
121
- end
122
-
123
- def user_url(user)
124
- "#{host_with_protocol}#{user.profile_path}"
125
- end
126
-
127
- def invalid_grant
128
- { json: { 'error': 'invalid_grant' }, status: :bad_request }
103
+ def oauth_error(error, message=nil)
104
+ resp = { json: {'error': error} }
105
+ resp[:json]['error_message'] = message unless message.nil?
106
+ { json: resp, status: :bad_request }
129
107
  end
130
108
 
131
109
  def token_expired
@@ -142,33 +120,42 @@ module Authorio
142
120
 
143
121
  def invalid_request?(req)
144
122
  req.redirect_uri != params[:redirect_uri] \
145
- || req.client != params[:client_id] \
146
- || req.created_at < Time.now - 10.minutes
123
+ || req.client != params[:client_id] \
124
+ || req.created_at < Time.now - 10.minutes
147
125
  end
148
126
 
149
127
  def validate_request
150
128
  req = Request.find_by code: params[:code]
151
- raise Authorio::Exceptions::InvalidGrant.new if req.nil?
129
+ raise Authorio::Exceptions::InvalidGrant, "code not found" if req.nil?
152
130
  req.delete
153
- raise Authorio::Exceptions::InvalidGrant.new if invalid_request?(req) || code_challenge_failed?
131
+ raise Authorio::Exceptions::InvalidGrant, "validation failed" if invalid_request?(req) || code_challenge_failed?
154
132
  req
155
133
  end
156
134
 
135
+ def profile(request)
136
+ profile = { me: user_url(request.authorio_user) }
137
+ if request.scope
138
+ scopes = request.scope.split
139
+ if scopes.include? 'profile'
140
+ profile['profile'] = {
141
+ name: request.authorio_user.full_name,
142
+ url: request.authorio_user.url,
143
+ photo: request.authorio_user.photo
144
+ }.compact
145
+ if scopes.include? 'email'
146
+ profile['profile']['email'] = request.authorio_user.email
147
+ end
148
+ end
149
+ end
150
+ profile
151
+ end
152
+
157
153
  def bearer_token
158
154
  bearer = /^Bearer /
159
155
  header = request.headers['Authorization']
160
156
  header.gsub(bearer, '') if header && header.match(bearer)
161
157
  end
162
158
 
163
- def user_session
164
- cookie = cookies.encrypted[:user] and Session.find_by_cookie(cookie)
165
- end
166
-
167
- def redirect_back_with_error(error)
168
- flash[:alert] = error
169
- redirect_back fallback_location: Authorio.authorization_path, allow_other_host: false
170
- end
171
-
172
159
  def authenticate_user_from_session_or_password
173
160
  session = user_session
174
161
  if session
@@ -180,5 +167,15 @@ module Authorio
180
167
  end
181
168
  end
182
169
 
170
+ ScopeDescriptions = {
171
+ 'profile': 'View basic profile information',
172
+ 'email': 'View your email address',
173
+ 'offline_access': 'Keep you logged in permanently (until revoked)'
174
+ }
175
+
176
+ def user_scope_description(scope)
177
+ ScopeDescriptions.dig(scope.to_sym) || scope
178
+ end
179
+
183
180
  end
184
181
  end
@@ -0,0 +1,66 @@
1
+ module Authorio
2
+ class AuthorioController < ActionController::Base
3
+ layout 'authorio/main'
4
+
5
+ helper_method :logged_in?, :rememberable?, :user_url, :current_user
6
+
7
+ def index
8
+ if logged_in?
9
+ redirect_to edit_user_path(1)
10
+ else
11
+ redirect_to new_session_path
12
+ end
13
+ end
14
+
15
+ def user_session
16
+ if session[:user_id]
17
+ Session.new(authorio_user: Authorio::User.find(session[:user_id]))
18
+ else
19
+ cookie = cookies.encrypted[:user] and Session.find_by_cookie(cookie)
20
+ end
21
+ end
22
+
23
+ def logged_in?
24
+ !user_session.nil?
25
+ end
26
+
27
+ def rememberable?
28
+ !logged_in? && Authorio.configuration.local_session_lifetime
29
+ end
30
+
31
+ def authorized?
32
+ redirect_to new_session_path unless logged_in?
33
+ end
34
+
35
+ def current_user
36
+ user_session&.authorio_user.id
37
+ end
38
+
39
+ def user_url(user)
40
+ "#{host_with_protocol}#{user.profile_path}"
41
+ end
42
+
43
+ protected
44
+
45
+ def auth_user_params
46
+ params.require(:user).permit(:password, :url, :remember_me)
47
+ end
48
+
49
+ def set_session_cookie(user)
50
+ cookies.encrypted[:user] = {
51
+ value: Authorio::Session.create(authorio_user: user).as_cookie,
52
+ expires: Authorio.configuration.local_session_lifetime
53
+ }
54
+ end
55
+
56
+ def redirect_back_with_error(error)
57
+ flash[:alert] = error
58
+ redirect_back fallback_location: Authorio.authorization_path, allow_other_host: false
59
+ end
60
+
61
+ def host_with_protocol
62
+ "#{request.scheme}://#{request.host}"
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,32 @@
1
+ module Authorio
2
+ class SessionsController < AuthorioController
3
+
4
+ # GET /session/new
5
+ def new
6
+ @session = Session.new(authorio_user: User.first)
7
+ end
8
+
9
+ # POST /session
10
+ def create
11
+ user = User.find_by! profile_path: URI(auth_user_params[:url]).path
12
+ raise Exceptions::InvalidPassword unless user.authenticate(auth_user_params[:password])
13
+ set_session_cookie(user) if auth_user_params[:remember_me]
14
+
15
+ # Even if we don't have a permanent remember-me session, we make a temporary session
16
+ session[:user_id] = user.id
17
+ redirect_to edit_user_path(user)
18
+ rescue Exceptions::InvalidPassword
19
+ redirect_back_with_error "Incorrect password. Try again."
20
+ end
21
+
22
+ # DELETE /session
23
+ def destroy
24
+ reset_session
25
+ if (cookie = cookies.encrypted[:user]) && session = Session.find_by_cookie(cookie)
26
+ cookies.delete :user
27
+ session.destroy
28
+ end
29
+ redirect_to new_session_path
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,24 @@
1
+ module Authorio
2
+ class UsersController < AuthorioController
3
+
4
+ before_action :authorized?
5
+
6
+ # GET /users/:id/edit
7
+ def edit
8
+ @user = User.find(params[:id])
9
+ end
10
+
11
+ # PATCH /users/:id
12
+ def update
13
+ User.find(params[:id]).update(user_params)
14
+ flash[:info] = "Profile Saved"
15
+ redirect_to edit_user_path
16
+ end
17
+
18
+ private
19
+
20
+ def user_params
21
+ params.require(:user).permit(:url, :photo, :full_name, :email)
22
+ end
23
+ end
24
+ end
@@ -3,5 +3,10 @@ module Authorio
3
3
  belongs_to :authorio_user, class_name: "::Authorio::User"
4
4
 
5
5
  validates_presence_of :code, :redirect_uri, :client
6
+
7
+ # User has the right to modify requested scope
8
+ def update_scope(scope)
9
+ update(scope: scope.join(' '))
10
+ end
6
11
  end
7
12
  end
@@ -30,7 +30,7 @@ module Authorio
30
30
  end
31
31
 
32
32
  def expired?
33
- return expires_at < Time.now
33
+ expires_at < Time.now
34
34
  end
35
35
 
36
36
  def as_cookie
@@ -1,5 +1,10 @@
1
1
  module Authorio
2
2
  class User < ApplicationRecord
3
3
  has_secure_password
4
+
5
+ def self.find_by_url!(url)
6
+ find_by! profile_path: URI(url || "/").path
7
+ end
8
+
4
9
  end
5
10
  end
@@ -1,4 +1,3 @@
1
- <%= stylesheet_link_tag "authorio/auth" %>
2
1
  <% content_for :title, "Authorio Login" %>
3
2
 
4
3
  <div class="container authorio-auth">
@@ -7,26 +6,10 @@
7
6
  <div class="col-md-4 auth-panel">
8
7
  <h3>Authorio</h3>
9
8
  <div class="client-row">
10
- Authenticating with <span class="client"><%= params[:client_id] %>
9
+ <span class="client"><%= params[:client_id] %></span> wants to authenticate
10
+ <% if @scope %>and also<% end %>
11
11
  </div>
12
- <%= form_with(model: @user, url: authorize_user_path(@user), method: :post) do |form| %>
13
- <%= form.label(:url, "User URL") %>
14
- <%= form.text_field(:url, value: params[:me], readonly: true) %>
15
- <% unless @user_logged_in_locally %>
16
- <%= form.label(:password, "Password") %>
17
- <%= form.password_field(:password, autofocus: true) %>
18
- <% if @rememberable %>
19
- <%= label_tag(:remember_me, class: 'remember') do %>
20
- <%= form.check_box :remember_me %>
21
- <span class='r-m'>Remember me for <%= distance_of_time_in_words Authorio.configuration.local_session_lifetime -%></span>
22
- <% end %>
23
- <% end %>
24
- <% end %>
25
- <div class='auth-btn-row'>
26
- <%= form.submit("Cancel", class: 'btn btn-default auth-btn') %>
27
- <%= form.submit("Sign in", class: 'btn btn-success auth-btn') %>
28
- </div>
29
- <% end %>
12
+ <%= render 'shared/login_form', target: authorize_user_path(@user), user: @user, scopes: @scope, cancel: true %>
30
13
  </div>
31
14
  <div class="col-md-4"></div>
32
15
  </div>
@@ -0,0 +1,15 @@
1
+ <%= stylesheet_link_tag "authorio/auth" %>
2
+ <% content_for :title, "Authorio Local Login" %>
3
+
4
+ <div class="container authorio-auth">
5
+ <div class="row">
6
+ <div class="col-md-4"></div>
7
+ <div class="col-md-4 auth-panel">
8
+ <h3>Authorio</h3>
9
+ <div class="client-row">Local Login</div>
10
+ <%= render 'shared/login_form', target: session_path(@session),
11
+ user: @session.authorio_user, scopes: nil, cancel: false %>
12
+ </div>
13
+ <div class="col-md-4"></div>
14
+ </div>
15
+ </div>
@@ -0,0 +1,25 @@
1
+ <%= stylesheet_link_tag "authorio/auth" %>
2
+ <% content_for :title, "Account Settings" %>
3
+
4
+ <div class="container authorio-auth">
5
+ <div class="row">
6
+ <div class="col-md-4"></div>
7
+ <div class="col-md-4 auth-panel">
8
+ <h3>Account Settings</h3>
9
+ <%= form_with model: @user do |form| %>
10
+ <%= form.label(:full_name, "Full Name") %>
11
+ <%= form.text_field(:full_name) %>
12
+ <%= form.label(:url, "URL") %>
13
+ <%= form.text_field(:url) %>
14
+ <%= form.label(:photo, "Photo URL") %>
15
+ <%= form.text_field(:photo) %>
16
+ <%= form.label(:email, "Email") %>
17
+ <%= form.text_field(:email) %>
18
+ <div class='auth-btn-row'>
19
+ <%= form.submit("Save Changes", class: 'btn btn-success auth-btn') %>
20
+ </div>
21
+ <% end -%>
22
+ </div>
23
+ <div class="col-md-4"></div>
24
+ </div>
25
+ </div>
@@ -11,9 +11,20 @@
11
11
  integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
12
12
  crossorigin="anonymous">
13
13
 
14
- <%= stylesheet_link_tag "authorio/application", media: "all" %>
14
+ <%= stylesheet_link_tag "authorio/application", media: "all" %>
15
+ <%= stylesheet_link_tag "authorio/auth" %>
15
16
  </head>
16
- <body data-no-turbolinks="true" data-turbolinks="false">
17
+ <body>
18
+
19
+ <% if logged_in? %>
20
+ <div class="topbar">
21
+ <ul>
22
+ <li>Authorio</li>
23
+ <li><a href="<%= edit_user_path(current_user) -%>">Account Settings</a></li>
24
+ <li><a href="<%= logout_path(method: :delete) -%>">Log Out</a></li>
25
+ </ul>
26
+ </div>
27
+ <% end -%>
17
28
 
18
29
  <% flash.each do |key, value| %>
19
30
  <div class="alert alert-warning">
@@ -0,0 +1,36 @@
1
+ <%= form_with(model: user, url: target, method: :post) do |form| %>
2
+ <% if scopes %>
3
+ <%= fields_for :scope do |req_scope| %>
4
+ <div class="scopes">
5
+ <ul class="scope">
6
+ <% for scope in scopes %>
7
+ <li>
8
+ <%= label_tag(:scope, class: 'scope-label') do %>
9
+ <%= req_scope.check_box(:scope, {multiple: true, checked: true}, scope, nil) %>
10
+ <%= user_scope_description scope %>
11
+ <% end -%>
12
+ </li>
13
+ <%- end %>
14
+ </ul>
15
+ </div>
16
+ <% end %>
17
+ <% end -%>
18
+ <%= form.label(:url, "User URL") %>
19
+ <%= form.text_field(:url, value: params[:me] || user_url(user), readonly: true) %>
20
+ <% unless logged_in? %>
21
+ <%= form.label(:password, "Password") %>
22
+ <%= form.password_field(:password, autofocus: true) %>
23
+ <% if rememberable? %>
24
+ <%= label_tag(:remember_me, class: 'remember') do %>
25
+ <%= form.check_box :remember_me %>
26
+ <span class='r-m'>Remember me for <%= distance_of_time_in_words Authorio.configuration.local_session_lifetime -%></span>
27
+ <% end %>
28
+ <% end %>
29
+ <% end %>
30
+ <div class='auth-btn-row'>
31
+ <% if cancel %>
32
+ <%= form.submit("Cancel", class: 'btn btn-default auth-btn') %>
33
+ <% end %>
34
+ <%= form.submit("Sign in", class: 'btn btn-success auth-btn') %>
35
+ </div>
36
+ <% end %>
data/config/routes.rb CHANGED
@@ -1,9 +1,12 @@
1
1
  Authorio::Engine.routes.draw do
2
2
  get Authorio.configuration.authorization_endpoint, controller: 'auth', action: 'authorization_interface'
3
3
  post Authorio.configuration.authorization_endpoint, controller: 'auth', action: 'send_profile'
4
- resources :users do
4
+ resources :users, only: [:edit, :update] do
5
5
  post 'authorize', on: :member, to: 'auth#authorize_user'
6
6
  end
7
+ resource :session, only: [:new, :create]
8
+ get 'session' => 'sessions#destroy', as: 'logout'
7
9
  get Authorio.configuration.token_endpoint, controller: 'auth', action: 'verify_token'
8
10
  post Authorio.configuration.token_endpoint, controller: 'auth', action: 'issue_token'
9
- end
11
+ root to: 'authorio#index'
12
+ end
@@ -0,0 +1,8 @@
1
+ class AddProfileToUsers < ActiveRecord::Migration[6.1]
2
+ def change
3
+ add_column :authorio_users, :email, :string
4
+ add_column :authorio_users, :full_name, :string
5
+ add_column :authorio_users, :url, :string
6
+ add_column :authorio_users, :photo, :string
7
+ end
8
+ end
@@ -9,7 +9,7 @@ module Authorio
9
9
  end
10
10
 
11
11
  initializer "authorio.assets.precompile" do |app|
12
- app.config.assets.precompile += %w( authorio/auth.css )
12
+ app.config.assets.precompile += %w( authorio/auth.css authorio/application.css )
13
13
  end
14
14
  end
15
15
  end
@@ -1,3 +1,3 @@
1
1
  module Authorio
2
- VERSION = '0.8.2'
2
+ VERSION = '0.8.3'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: authorio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.2
4
+ version: 0.8.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Meckler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-26 00:00:00.000000000 Z
11
+ date: 2021-08-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -114,6 +114,9 @@ files:
114
114
  - app/assets/stylesheets/authorio/application.css
115
115
  - app/assets/stylesheets/authorio/auth.css
116
116
  - app/controllers/authorio/auth_controller.rb
117
+ - app/controllers/authorio/authorio_controller.rb
118
+ - app/controllers/authorio/sessions_controller.rb
119
+ - app/controllers/authorio/users_controller.rb
117
120
  - app/helpers/authorio/tag_helper.rb
118
121
  - app/jobs/authorio/application_job.rb
119
122
  - app/models/authorio/application_record.rb
@@ -122,13 +125,17 @@ files:
122
125
  - app/models/authorio/token.rb
123
126
  - app/models/authorio/user.rb
124
127
  - app/views/authorio/auth/authorization_interface.html.erb
128
+ - app/views/authorio/sessions/new.html.erb
129
+ - app/views/authorio/users/edit.html.erb
125
130
  - app/views/layouts/authorio/main.html.erb
131
+ - app/views/shared/_login_form.html.erb
126
132
  - config/routes.rb
127
133
  - db/migrate/20210627230156_create_authorio_users.rb
128
134
  - db/migrate/20210627230416_create_authorio_requests.rb
129
135
  - db/migrate/20210707230416_create_authorio_tokens.rb
130
136
  - db/migrate/20210723161041_add_expiry_to_tokens.rb
131
137
  - db/migrate/20210726164625_create_authorio_sessions.rb
138
+ - db/migrate/20210801184120_add_profile_to_users.rb
132
139
  - lib/authorio.rb
133
140
  - lib/authorio/configuration.rb
134
141
  - lib/authorio/engine.rb