rodauth-oauth 0.7.0 → 0.7.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +51 -1
- data/README.md +1 -1
- data/lib/generators/rodauth/oauth/install_generator.rb +1 -1
- data/lib/generators/rodauth/oauth/templates/app/views/rodauth/authorize.html.erb +29 -0
- data/lib/generators/rodauth/oauth/templates/app/views/rodauth/new_oauth_application.html.erb +38 -0
- data/lib/generators/rodauth/oauth/templates/app/views/rodauth/oauth_application.html.erb +17 -0
- data/lib/generators/rodauth/oauth/templates/app/views/rodauth/oauth_applications.html.erb +29 -0
- data/lib/generators/rodauth/oauth/templates/app/views/rodauth/oauth_tokens.html.erb +38 -0
- data/lib/generators/rodauth/oauth/views_generator.rb +9 -4
- data/lib/rodauth/features/oauth.rb +40 -9
- data/lib/rodauth/oauth/version.rb +1 -1
- data/lib/rodauth/oauth.rb +0 -2
- data/locales/en.yml +2 -1
- data/templates/authorize.str +18 -8
- data/templates/oauth_application.str +2 -2
- data/templates/oauth_tokens.str +10 -8
- metadata +29 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cbc2a014ad242752b436e810b24df8839c00c7a066b860e4cf418c16f19cfbad
|
4
|
+
data.tar.gz: e8c27858547f1df38662608cf74f6f75f48b438ec29137bfffd820320077b185
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8cabdea042eb26aaf1941ff9881f4cce9ffa4eb35557d7105d3c2195ced323f860654be7d161e56c85d91f7312fd041a39379516b97d6df47cf1637f273fb1f
|
7
|
+
data.tar.gz: d45c638c97f34705ddfe0ab124da3ed143188513454192aae65c4227d5e255ed0e5223fd3b3273418e2cc12896a7c175ce4786ecc20d6e611a1e4a3b28e412ca
|
data/CHANGELOG.md
CHANGED
@@ -2,11 +2,61 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
### 0.7.4 (15/01/2022)
|
6
|
+
|
7
|
+
#### Bugfixes
|
8
|
+
|
9
|
+
* including missing erb templates in the package.
|
10
|
+
|
11
|
+
## 0.7.3 (14/01/2022)
|
12
|
+
|
13
|
+
#### Bugfixes
|
14
|
+
|
15
|
+
* fixed generator declarations and views generator, in orderto copy templates and rewrite paths accordingly.
|
16
|
+
* update view templates to not use "%%".
|
17
|
+
|
18
|
+
#### Chore
|
19
|
+
|
20
|
+
* `rodauth` is now declared as a dependency, with minimum version set `2.0`.
|
21
|
+
|
22
|
+
### 0.7.2 (14/12/2021)
|
23
|
+
|
24
|
+
#### Features
|
25
|
+
|
26
|
+
* Revoking tokens from the OAuth Application management interface (@muellerj)
|
27
|
+
|
28
|
+
Token revocation was only possible when using the client ID and Secret, to aid "logout" functionality from client applications. Although the admin interface (available via `r.oauth_applications`) displayed a "Revoke" button alongside tokens in the list page, this was not working. The RFC does allow for the use case of application administrators being able to manually revoke tokens (as a result of client support, for example), so this functionality was enabled (only for the oauth application owner, for now).
|
29
|
+
|
30
|
+
#### Bugfixes
|
31
|
+
|
32
|
+
Default scope usage related bugfixes:
|
33
|
+
|
34
|
+
* Improved default scope conversion to avoid nested arrays (@muellerj);
|
35
|
+
* Authorize form shows a disabled checkbox and POST's no scope when default scope is to be used (@muellerj);
|
36
|
+
* example default scope fixed for example authorization server (should be string) (@muellerj);
|
37
|
+
* several param fixes in view templates (@muellerj);
|
38
|
+
|
39
|
+
OAuth Applications Management fixes:
|
40
|
+
|
41
|
+
* Access to OAuth Application page is now restricted to app owner;
|
42
|
+
* OAuth Applications page now lists the **only** the applications owned by the logged in user;
|
43
|
+
|
44
|
+
### 0.7.1 (05/12/2021)
|
45
|
+
|
46
|
+
#### Improvements
|
47
|
+
|
48
|
+
* Adapted the `rodauth-i18n` configuration to comply with the guidelines for `v0.2.0` (which is the defacto minimmal supported version).
|
49
|
+
|
50
|
+
#### Bugfixes
|
51
|
+
|
52
|
+
* `convert_timestamp` was removed from the templates, as it's private API.
|
53
|
+
* Several missing or wrong URLs in templates fixed (authorize form was wrongly processing scopes when none was selected).
|
54
|
+
|
5
55
|
### 0.7.0 (02/12/2021)
|
6
56
|
|
7
57
|
#### Features
|
8
58
|
|
9
|
-
* Internationalization (i18n) support by hooking on [rodauth-
|
59
|
+
* Internationalization (i18n) support by hooking on [rodauth-i18n](https://github.com/janko/rodauth-i18n).
|
10
60
|
* Sets all text using `translatable_method`.
|
11
61
|
* Provides english translations for all `rodauth-oauth` related user facing text.
|
12
62
|
|
data/README.md
CHANGED
@@ -173,7 +173,7 @@ puts payload #=> {"access_token" => "awr23f3h8f9d2h89...", "token_type" => "Bear
|
|
173
173
|
|
174
174
|
#### Revoking tokens
|
175
175
|
|
176
|
-
Token revocation can be done both by the
|
176
|
+
Token revocation can be done both by the identity owner or the application owner, and can therefore be done either online (browser-based form) or server-to-server. Here's an example using server-to-server:
|
177
177
|
|
178
178
|
```ruby
|
179
179
|
require "httpx"
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<%= form_tag rodauth.authorize_path, method: :post do %>
|
2
|
+
<p class="lead">The application <%= rodauth.oauth_application[rodauth.oauth_applications_name_column] %> would like to access your data.</p>
|
3
|
+
|
4
|
+
<div class="form-group">
|
5
|
+
<h1 class="display-6"><%= rodauth.scopes_label %></h1>
|
6
|
+
|
7
|
+
<% rodauth.scopes.each do |scope| %>
|
8
|
+
<% is_default = scope == rodauth.oauth_application_default_scope %>
|
9
|
+
<div class="form-check">
|
10
|
+
<%= check_box_tag "scope[]", scope, is_default, disabled: is_default, id: scope, class: "form-check-input" %>
|
11
|
+
<%= label_tag scope, scope, class: "form-check-label" %>
|
12
|
+
<%= hidden_field_tag "scope[]", scope if is_default %>
|
13
|
+
</div>
|
14
|
+
<% end %>
|
15
|
+
<%= hidden_field_tag :client_id, params[:client_id] %>
|
16
|
+
<% %i[access_type response_type state nonce redirect_uri code_challenge code_challenge_method].each do |oauth_param| %>
|
17
|
+
<% if params[oauth_param] %>
|
18
|
+
<%= hidden_field_tag oauth_param, params[oauth_param] %>
|
19
|
+
<% end %>
|
20
|
+
<% end %>
|
21
|
+
<% if params[:response_mode] %>
|
22
|
+
<%= hidden_field_tag :response_mode, params[:response_mode] %>
|
23
|
+
<% end %>
|
24
|
+
</div>
|
25
|
+
<p class="text-center">
|
26
|
+
<%= submit_tag "Authorize", class: "btn btn-outline-primary" %>
|
27
|
+
<%= link_to "Cancel", "#{rodauth.redirect_uri}?error=access_denied&error_description=The+resource+owner+or+authorization+server+denied+the+request#{"&state=\#{rodauth.state}" if params[:state] }", class: "btn btn-outline-danger" %>
|
28
|
+
</p>
|
29
|
+
<% end %>
|
@@ -0,0 +1,38 @@
|
|
1
|
+
<%= form_tag rodauth.oauth_applications_path, method: :post, class: "form-horizontal" do %>
|
2
|
+
<h2>Register Oauth Application</h2>
|
3
|
+
<%= rodauth.field_error('scope') %>
|
4
|
+
<div class="form-group">
|
5
|
+
<%= label_tag "name", "Name" %>
|
6
|
+
<%= text_field_tag "name", rodauth.param('name'), class: "form-control#{' is-invalid' if rodauth.field_error('name')}" %>
|
7
|
+
<%= rodauth.field_error('name') %>
|
8
|
+
</div>
|
9
|
+
<div class="form-group">
|
10
|
+
<%= label_tag "description", "Description" %>
|
11
|
+
<%= text_field_tag "description", rodauth.param('description'), class: "form-control#{' is-invalid' if rodauth.field_error('description')}" %>
|
12
|
+
<%= rodauth.field_error('description') %>
|
13
|
+
</div>
|
14
|
+
<div class="form-group">
|
15
|
+
<%= label_tag "homepage_url", "Homepage URL" %>
|
16
|
+
<%= text_field_tag "homepage_url", rodauth.param('homepage_url'), class: "form-control#{' is-invalid' if rodauth.field_error('homepage_url')}" %>
|
17
|
+
<%= rodauth.field_error('homepage_url') %>
|
18
|
+
</div>
|
19
|
+
<div class="form-group">
|
20
|
+
<%= label_tag "redirect_uri", "Redirect URL" %>
|
21
|
+
<%= text_field_tag "redirect_uri", rodauth.param('redirect_uri'), class: "form-control#{' is-invalid' if rodauth.field_error('redirect_uri')}" %>
|
22
|
+
<%= rodauth.field_error('redirect_uri') %>
|
23
|
+
</div>
|
24
|
+
<div class="form-group">
|
25
|
+
<%= label_tag "client_secret", "Secret (make it random and at least 32 character-long)" %>
|
26
|
+
<%= text_field_tag "client_secret", rodauth.param('client_secret'), class: "form-control#{' is-invalid' if rodauth.field_error('client_secret')}" %>
|
27
|
+
<%= rodauth.field_error('client_secret') %>
|
28
|
+
</div>
|
29
|
+
<% rodauth.oauth_application_scopes.each do |scope| %>
|
30
|
+
<div class="form-check">
|
31
|
+
<%= check_box_tag "scopes[]", scope, scope == rodauth.oauth_application_default_scope, id: scope, class: "form-check-input" %>
|
32
|
+
<%= scope %>
|
33
|
+
</div>
|
34
|
+
<% end %>
|
35
|
+
<div class="form-group">
|
36
|
+
<%= submit_tag "Register", class: "btn btn-primary" %>
|
37
|
+
</div>
|
38
|
+
<% end %>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<% oauth_application = rodauth.scope.instance_variable_get(:@oauth_application) %>
|
2
|
+
<div>
|
3
|
+
<h2><%= oauth_application[rodauth.oauth_applications_name_column] %></h2>
|
4
|
+
|
5
|
+
<dl>
|
6
|
+
<dt>Description: </dt>
|
7
|
+
<dd><%= oauth_application[rodauth.oauth_applications_description_column] %></dd>
|
8
|
+
<dt>Homepage URL: </dt>
|
9
|
+
<dd><%= oauth_application[rodauth.oauth_applications_homepage_url_column] %></dd>
|
10
|
+
<dt>Client ID: </dt>
|
11
|
+
<dd><%= oauth_application[rodauth.oauth_applications_client_id_column] %></dd>
|
12
|
+
<dt>Redirect URL: </dt>
|
13
|
+
<dd><%= oauth_application[rodauth.oauth_applications_redirect_uri_column] %></dd>
|
14
|
+
<dt>Scopes: </dt>
|
15
|
+
<dd><%= oauth_application[rodauth.oauth_applications_scopes_column] %></dd>
|
16
|
+
</dl>
|
17
|
+
</div>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<% oauth_applications_ds = rodauth.scope.instance_variable_get(:@oauth_applications) %>
|
2
|
+
<% apps_count = oauth_applications_ds.count %>
|
3
|
+
<div class="btn-group" role="group" aria-label="Buttons">
|
4
|
+
<%= link_to "New Oauth Application", "#{rodauth.oauth_applications_path}/new", class: "btn btn-secondary" %>
|
5
|
+
</div>
|
6
|
+
<% if apps_count.zero? %>
|
7
|
+
<p>No oauth applications yet!</p>
|
8
|
+
<% else %>
|
9
|
+
<table class="table">
|
10
|
+
<thead>
|
11
|
+
<tr>
|
12
|
+
<th scope="col">Client ID (<%= apps_count %>)</th>
|
13
|
+
<th scope="col">Name</th>
|
14
|
+
<th scope="col">Homepage</th>
|
15
|
+
<th scope="col"></th>
|
16
|
+
</tr>
|
17
|
+
</thead>
|
18
|
+
<tbody>
|
19
|
+
<% oauth_applications_ds.each do |application| %>
|
20
|
+
<tr>
|
21
|
+
<td><%= application[rodauth.oauth_applications_client_id_column] %></td>
|
22
|
+
<td><%= application[rodauth.oauth_applications_name_column] %></td>
|
23
|
+
<td><%= application[rodauth.oauth_applications_homepage_url_column] %></td>
|
24
|
+
<td><%= link_to "Show", rodauth.oauth_application_path(application[rodauth.oauth_applications_id_column]) %></td>
|
25
|
+
</tr>
|
26
|
+
<% end %>
|
27
|
+
</tbody>
|
28
|
+
</table>
|
29
|
+
<% end %>
|
@@ -0,0 +1,38 @@
|
|
1
|
+
<% oauth_tokens_ds = rodauth.scope.instance_variable_get(:@oauth_tokens) %>
|
2
|
+
<% tokens_count = oauth_tokens_ds.count %>
|
3
|
+
<% if tokens_count.zero? %>
|
4
|
+
<p>No oauth tokens yet!</p>
|
5
|
+
<% else %>
|
6
|
+
<table class="table">
|
7
|
+
<thead>
|
8
|
+
<tr>
|
9
|
+
<th scope="col">Token</th>
|
10
|
+
<th scope="col">Refresh Token</th>
|
11
|
+
<th scope="col">Expires in</th>
|
12
|
+
<th scope="col">Revoked at</th>
|
13
|
+
<th scope="col">Scopes</th>
|
14
|
+
<th scope="col"><span class="badge badge-pill badge-dark"><%= tokens_count %></span>
|
15
|
+
</tr>
|
16
|
+
</thead>
|
17
|
+
<tbody>
|
18
|
+
<% oauth_tokens_ds.each do |application| %>
|
19
|
+
<tr>
|
20
|
+
<td><code class="token"><%= oauth_token[rodauth.oauth_tokens_token_column] %></code></td>
|
21
|
+
<td><code class="token"><%= oauth_token[rodauth.oauth_tokens_refresh_token_column] %></code></td>
|
22
|
+
<td><%= oauth_token[rodauth.oauth_tokens_expires_in_column] %></td>
|
23
|
+
<td><%= oauth_token[rodauth.oauth_tokens_revoked_at_column] %></td>
|
24
|
+
<td><%= oauth_token[rodauth.oauth_tokens_scopes_column] %></td>
|
25
|
+
<td>
|
26
|
+
<% if !oauth_token[rodauth.oauth_tokens_revoked_at_column] %>
|
27
|
+
<%= form_tag rodauth.revoke_path, method: :post do %>
|
28
|
+
<%= hidden_field_tag :token_type_hint, "access_token" %>
|
29
|
+
<%= hidden_field_tag :token, oauth_token[rodauth.oauth_tokens_token_column] %>
|
30
|
+
<%= submit_tag "Revoke", class: "btn btn-danger" %>
|
31
|
+
<% end %>
|
32
|
+
<% end %>
|
33
|
+
</td>
|
34
|
+
</tr>
|
35
|
+
<% end %>
|
36
|
+
</tbody>
|
37
|
+
</table>
|
38
|
+
<% end %>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "rails/generators
|
3
|
+
require "rails/generators"
|
4
4
|
|
5
5
|
module Rodauth::OAuth
|
6
6
|
module Rails
|
@@ -8,6 +8,7 @@ module Rodauth::OAuth
|
|
8
8
|
class ViewsGenerator < ::Rails::Generators::Base
|
9
9
|
source_root "#{__dir__}/templates"
|
10
10
|
namespace "rodauth:oauth:views"
|
11
|
+
desc "Generate db migrations for rodauth-oauth in your application."
|
11
12
|
|
12
13
|
DEFAULT = %w[authorize].freeze
|
13
14
|
VIEWS = {
|
@@ -31,16 +32,20 @@ module Rodauth::OAuth
|
|
31
32
|
default: "rodauth"
|
32
33
|
|
33
34
|
def create_views
|
34
|
-
features = options[:all] ? VIEWS.keys : (
|
35
|
+
features = options[:all] ? VIEWS.keys : (%i[oauth_authorize] + options[:features]).map(&:to_sym).uniq
|
35
36
|
|
36
37
|
views = features.inject([]) do |list, feature|
|
37
38
|
list |= VIEWS[feature] || []
|
38
39
|
list |= VIEWS[DEPENDENCIES[feature]] || []
|
39
40
|
end
|
40
41
|
|
42
|
+
directory = options[:directory].underscore
|
41
43
|
views.each do |view|
|
42
|
-
|
43
|
-
"app/views/#{
|
44
|
+
copy_file "app/views/rodauth/#{view}.html.erb",
|
45
|
+
"app/views/#{directory}/#{view}.html.erb" do |content|
|
46
|
+
content = content.gsub("rodauth/", "#{directory}/")
|
47
|
+
content
|
48
|
+
end
|
44
49
|
end
|
45
50
|
end
|
46
51
|
end
|
@@ -66,6 +66,7 @@ module Rodauth
|
|
66
66
|
notice_flash "Your oauth application has been registered", "create_oauth_application"
|
67
67
|
|
68
68
|
notice_flash "The oauth token has been revoked", "revoke_oauth_token"
|
69
|
+
error_flash "You are not authorized to revoke this token", "revoke_unauthorized_account"
|
69
70
|
|
70
71
|
view "authorize", "Authorize", "authorize"
|
71
72
|
view "oauth_applications", "Oauth Applications", "oauth_applications"
|
@@ -279,7 +280,13 @@ module Rodauth
|
|
279
280
|
next unless is_authorization_server?
|
280
281
|
|
281
282
|
before_revoke_route
|
282
|
-
|
283
|
+
|
284
|
+
if logged_in?
|
285
|
+
require_account
|
286
|
+
require_oauth_application_from_account
|
287
|
+
else
|
288
|
+
require_oauth_application
|
289
|
+
end
|
283
290
|
|
284
291
|
r.post do
|
285
292
|
catch_error do
|
@@ -386,7 +393,10 @@ module Rodauth
|
|
386
393
|
end
|
387
394
|
|
388
395
|
request.on(oauth_applications_id_pattern) do |id|
|
389
|
-
oauth_application = db[oauth_applications_table]
|
396
|
+
oauth_application = db[oauth_applications_table]
|
397
|
+
.where(oauth_applications_id_column => id)
|
398
|
+
.where(oauth_applications_account_id_column => account_id)
|
399
|
+
.first
|
390
400
|
next unless oauth_application
|
391
401
|
|
392
402
|
scope.instance_variable_set(:@oauth_application, oauth_application)
|
@@ -407,7 +417,8 @@ module Rodauth
|
|
407
417
|
end
|
408
418
|
|
409
419
|
request.get do
|
410
|
-
scope.instance_variable_set(:@oauth_applications, db[oauth_applications_table]
|
420
|
+
scope.instance_variable_set(:@oauth_applications, db[oauth_applications_table]
|
421
|
+
.where(oauth_applications_account_id_column => account_id))
|
411
422
|
oauth_applications_view
|
412
423
|
end
|
413
424
|
|
@@ -474,7 +485,7 @@ module Rodauth
|
|
474
485
|
when String
|
475
486
|
scope.split(" ")
|
476
487
|
when nil
|
477
|
-
|
488
|
+
Array(oauth_application_default_scope)
|
478
489
|
end
|
479
490
|
end
|
480
491
|
|
@@ -570,6 +581,8 @@ module Rodauth
|
|
570
581
|
end
|
571
582
|
|
572
583
|
self.class.send(:define_method, :__one_oauth_token_per_account) { one_oauth_token_per_account }
|
584
|
+
|
585
|
+
i18n_register(File.expand_path(File.join(__dir__, "..", "..", "..", "locales"))) if features.include?(:i18n)
|
573
586
|
end
|
574
587
|
|
575
588
|
def use_date_arithmetic?
|
@@ -682,6 +695,20 @@ module Rodauth
|
|
682
695
|
authorization_required unless @oauth_application && secret_matches?(@oauth_application, client_secret)
|
683
696
|
end
|
684
697
|
|
698
|
+
def require_oauth_application_from_account
|
699
|
+
ds = db[oauth_applications_table]
|
700
|
+
.join(oauth_tokens_table, Sequel[oauth_tokens_table][oauth_tokens_oauth_application_id_column] =>
|
701
|
+
Sequel[oauth_applications_table][oauth_applications_id_column])
|
702
|
+
.where(oauth_token_by_token_ds(param("token")).opts.fetch(:where, true))
|
703
|
+
.where(Sequel[oauth_applications_table][oauth_applications_account_id_column] => account_id)
|
704
|
+
|
705
|
+
@oauth_application = ds.qualify.first
|
706
|
+
return if @oauth_application
|
707
|
+
|
708
|
+
set_redirect_error_flash revoke_unauthorized_account_error_flash
|
709
|
+
redirect request.referer || "/"
|
710
|
+
end
|
711
|
+
|
685
712
|
def secret_matches?(oauth_application, secret)
|
686
713
|
BCrypt::Password.new(oauth_application[oauth_applications_client_secret_column]) == secret
|
687
714
|
end
|
@@ -772,17 +799,21 @@ module Rodauth
|
|
772
799
|
end
|
773
800
|
end
|
774
801
|
|
775
|
-
def
|
802
|
+
def oauth_token_by_token_ds(token)
|
776
803
|
ds = db[oauth_tokens_table]
|
777
804
|
|
778
805
|
ds = if oauth_tokens_token_hash_column
|
779
|
-
ds.where(oauth_tokens_token_hash_column => generate_token_hash(token))
|
806
|
+
ds.where(Sequel[oauth_tokens_table][oauth_tokens_token_hash_column] => generate_token_hash(token))
|
780
807
|
else
|
781
|
-
ds.where(oauth_tokens_token_column => token)
|
808
|
+
ds.where(Sequel[oauth_tokens_table][oauth_tokens_token_column] => token)
|
782
809
|
end
|
783
810
|
|
784
|
-
ds.where(Sequel[oauth_tokens_expires_in_column] >= Sequel::CURRENT_TIMESTAMP)
|
785
|
-
.where(oauth_tokens_revoked_at_column => nil)
|
811
|
+
ds.where(Sequel[oauth_tokens_table][oauth_tokens_expires_in_column] >= Sequel::CURRENT_TIMESTAMP)
|
812
|
+
.where(Sequel[oauth_tokens_table][oauth_tokens_revoked_at_column] => nil)
|
813
|
+
end
|
814
|
+
|
815
|
+
def oauth_token_by_token(token)
|
816
|
+
oauth_token_by_token_ds(token).first
|
786
817
|
end
|
787
818
|
|
788
819
|
def oauth_token_by_refresh_token(token, revoked: false)
|
data/lib/rodauth/oauth.rb
CHANGED
data/locales/en.yml
CHANGED
@@ -3,6 +3,7 @@ en:
|
|
3
3
|
require_authorization_error_flash: "Please authorize to continue"
|
4
4
|
create_oauth_application_error_flash: "There was an error registering your oauth application"
|
5
5
|
create_oauth_application_notice_flash: "Your oauth application has been registered"
|
6
|
+
revoke_unauthorized_account_error_flash: "You are not authorized to revoke this token"
|
6
7
|
revoke_oauth_token_notice_flash: "The oauth token has been revoked"
|
7
8
|
oauth_authorize_title: "Authorize"
|
8
9
|
oauth_oauth_applications_page_title: "Oauth Applications"
|
@@ -31,4 +32,4 @@ en:
|
|
31
32
|
unsupported_transform_algorithm_message: "transform algorithm not supported"
|
32
33
|
request_uri_not_supported_message: "request uri is unsupported"
|
33
34
|
invalid_request_object_message: "request object is invalid"
|
34
|
-
invalid_scope_message: "The Access Token expired"
|
35
|
+
invalid_scope_message: "The Access Token expired"
|
data/templates/authorize.str
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
<form method="post" class="form-horizontal" role="form" id="authorize-form">
|
1
|
+
<form method="post" action="#{rodauth.authorize_path}" class="form-horizontal" role="form" id="authorize-form">
|
2
2
|
#{csrf_tag(rodauth.authorize_path) if respond_to?(:csrf_tag)}
|
3
3
|
<p class="lead">The application #{rodauth.oauth_application[rodauth.oauth_applications_name_column]} would like to access your data.</p>
|
4
4
|
|
@@ -7,12 +7,22 @@
|
|
7
7
|
|
8
8
|
#{
|
9
9
|
rodauth.scopes.map do |scope|
|
10
|
-
|
11
|
-
|
12
|
-
<
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
if scope == rodauth.oauth_application_default_scope
|
11
|
+
<<-HTML
|
12
|
+
<div class="form-check">
|
13
|
+
<input id="#{scope}" class="form-check-input" type="checkbox" name="scope[]" value="#{scope}" checked disabled>
|
14
|
+
<label class="form-check-label" for="#{scope}">#{scope}</label>
|
15
|
+
<input type="hidden" name="scope[]" value="#{scope}">
|
16
|
+
</div>
|
17
|
+
HTML
|
18
|
+
else
|
19
|
+
<<-HTML
|
20
|
+
<div class="form-check">
|
21
|
+
<input id="#{scope}" class="form-check-input" type="checkbox" name="scope[]" value="#{scope}">
|
22
|
+
<label class="form-check-label" for="#{scope}">#{scope}</label>
|
23
|
+
</div>
|
24
|
+
HTML
|
25
|
+
end
|
16
26
|
end.join
|
17
27
|
}
|
18
28
|
|
@@ -31,4 +41,4 @@
|
|
31
41
|
<input type="submit" class="btn btn-outline-primary" value="#{h(rodauth.oauth_authorize_button)}"/>
|
32
42
|
<a href="#{rodauth.redirect_uri}?error=access_denied&error_description=The+resource+owner+or+authorization+server+denied+the+request#{ "&state=#{rodauth.param("state")}" if rodauth.param_or_nil("state")}" class="btn btn-outline-danger">Cancel</a>
|
33
43
|
</p>
|
34
|
-
</form>
|
44
|
+
</form>
|
@@ -7,5 +7,5 @@
|
|
7
7
|
end.join
|
8
8
|
}
|
9
9
|
</dl>
|
10
|
-
<a href="
|
11
|
-
</div>
|
10
|
+
<a href="#{rodauth.oauth_applications_path}/#{@oauth_application[:id]}/#{rodauth.oauth_tokens_path}" class="btn btn-outline-secondary">Oauth Tokens</a>
|
11
|
+
</div>
|
data/templates/oauth_tokens.str
CHANGED
@@ -10,7 +10,8 @@
|
|
10
10
|
<th scope="col">Token</th>
|
11
11
|
<th scope="col">Refresh Token</th>
|
12
12
|
<th scope="col">Expires in</th>
|
13
|
-
<th scope="col">
|
13
|
+
<th scope="col">Revoked at</th>
|
14
|
+
<th scope="col">Scopes</th>
|
14
15
|
<th scope="col"><span class="badge badge-pill badge-dark">#{@oauth_tokens.count}</span>
|
15
16
|
</tr>
|
16
17
|
</thead>
|
@@ -19,16 +20,17 @@
|
|
19
20
|
@oauth_tokens.map do |oauth_token|
|
20
21
|
<<-HTML
|
21
22
|
<tr>
|
22
|
-
<td>#{oauth_token[rodauth.oauth_tokens_token_column]}</td>
|
23
|
-
<td>#{oauth_token[rodauth.oauth_tokens_refresh_token_column]}</td>
|
24
|
-
<td>#{
|
25
|
-
<td>#{
|
23
|
+
<td><code class="token">#{oauth_token[rodauth.oauth_tokens_token_column]}</code></td>
|
24
|
+
<td><code class="token">#{oauth_token[rodauth.oauth_tokens_refresh_token_column]}</code></td>
|
25
|
+
<td>#{oauth_token[rodauth.oauth_tokens_expires_in_column]}</td>
|
26
|
+
<td>#{oauth_token[rodauth.oauth_tokens_revoked_at_column]}</td>
|
27
|
+
<td>#{oauth_token[rodauth.oauth_tokens_scopes_column]}</td>
|
26
28
|
<td>
|
27
29
|
#{
|
28
|
-
if !oauth_token[rodauth.
|
30
|
+
if !oauth_token[rodauth.oauth_tokens_revoked_at_column] && !oauth_token[rodauth.oauth_tokens_token_hash_column]
|
29
31
|
<<-HTML
|
30
32
|
<form method="post" action="#{rodauth.revoke_path}" class="form-horizontal" role="form" id="revoke-form">
|
31
|
-
#{csrf_tag(rodauth.
|
33
|
+
#{csrf_tag(rodauth.revoke_path) if respond_to?(:csrf_tag)}
|
32
34
|
#{rodauth.input_field_string("token_type_hint", "revoke-token-type-hint", :value => "access_token", :type=>"hidden")}
|
33
35
|
#{rodauth.input_field_string("token", "revoke-token", :value => oauth_token[rodauth.oauth_tokens_token_column], :type=>"hidden")}
|
34
36
|
#{rodauth.button(rodauth.oauth_token_revoke_button)}
|
@@ -46,4 +48,4 @@
|
|
46
48
|
HTML
|
47
49
|
end
|
48
50
|
}
|
49
|
-
</div>
|
51
|
+
</div>
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rodauth-oauth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tiago Cardoso
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
11
|
+
date: 2022-01-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rodauth
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
13
27
|
description: Implementation of the OAuth 2.0 protocol on top of rodauth.
|
14
28
|
email:
|
15
29
|
- cardoso_tiago@hotmail.com
|
@@ -27,6 +41,11 @@ files:
|
|
27
41
|
- lib/generators/rodauth/oauth/templates/app/models/oauth_application.rb
|
28
42
|
- lib/generators/rodauth/oauth/templates/app/models/oauth_grant.rb
|
29
43
|
- lib/generators/rodauth/oauth/templates/app/models/oauth_token.rb
|
44
|
+
- lib/generators/rodauth/oauth/templates/app/views/rodauth/authorize.html.erb
|
45
|
+
- lib/generators/rodauth/oauth/templates/app/views/rodauth/new_oauth_application.html.erb
|
46
|
+
- lib/generators/rodauth/oauth/templates/app/views/rodauth/oauth_application.html.erb
|
47
|
+
- lib/generators/rodauth/oauth/templates/app/views/rodauth/oauth_applications.html.erb
|
48
|
+
- lib/generators/rodauth/oauth/templates/app/views/rodauth/oauth_tokens.html.erb
|
30
49
|
- lib/generators/rodauth/oauth/templates/db/migrate/create_rodauth_oauth.rb
|
31
50
|
- lib/generators/rodauth/oauth/views_generator.rb
|
32
51
|
- lib/rodauth/features/oauth.rb
|
@@ -52,11 +71,15 @@ files:
|
|
52
71
|
- templates/redirect_uri_field.str
|
53
72
|
- templates/scope_field.str
|
54
73
|
homepage: https://gitlab.com/honeyryderchuck/rodauth-oauth
|
55
|
-
licenses:
|
74
|
+
licenses:
|
75
|
+
- Apache-2.0
|
56
76
|
metadata:
|
57
|
-
homepage_uri: https://gitlab.
|
77
|
+
homepage_uri: https://honeyryderchuck.gitlab.io/rodauth-oauth/
|
78
|
+
documentation_uri: https://honeyryderchuck.gitlab.io/rodauth-oauth/rdoc/
|
79
|
+
bug_tracker_uri: https://gitlab.com/honeyryderchuck/rodauth-oauth/issues
|
58
80
|
source_code_uri: https://gitlab.com/honeyryderchuck/rodauth-oauth
|
59
81
|
changelog_uri: https://gitlab.com/honeyryderchuck/rodauth-oauth/-/blob/master/CHANGELOG.md
|
82
|
+
rubygems_mfa_required: 'true'
|
60
83
|
post_install_message:
|
61
84
|
rdoc_options: []
|
62
85
|
require_paths:
|
@@ -72,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
95
|
- !ruby/object:Gem::Version
|
73
96
|
version: '0'
|
74
97
|
requirements: []
|
75
|
-
rubygems_version: 3.2.
|
98
|
+
rubygems_version: 3.2.32
|
76
99
|
signing_key:
|
77
100
|
specification_version: 4
|
78
101
|
summary: Implementation of the OAuth 2.0 protocol on top of rodauth.
|