heroku-bouncer 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile.lock +6 -6
- data/README.md +15 -1
- data/lib/heroku/bouncer.rb +51 -30
- metadata +2 -2
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
heroku-bouncer (0.0
|
4
|
+
heroku-bouncer (0.1.0)
|
5
5
|
faraday (~> 0.8)
|
6
6
|
multi_json (~> 1.0)
|
7
7
|
omniauth-heroku (>= 0.1.0)
|
@@ -14,8 +14,8 @@ GEM
|
|
14
14
|
multipart-post (~> 1.1)
|
15
15
|
hashie (1.2.0)
|
16
16
|
httpauth (0.2.0)
|
17
|
-
jwt (0.1.
|
18
|
-
multi_json (>= 1.
|
17
|
+
jwt (0.1.7)
|
18
|
+
multi_json (>= 1.5)
|
19
19
|
multi_json (1.6.1)
|
20
20
|
multipart-post (1.2.0)
|
21
21
|
oauth2 (0.8.1)
|
@@ -27,20 +27,20 @@ GEM
|
|
27
27
|
omniauth (1.1.3)
|
28
28
|
hashie (~> 1.2)
|
29
29
|
rack
|
30
|
-
omniauth-heroku (0.1.
|
30
|
+
omniauth-heroku (0.1.1)
|
31
31
|
omniauth (~> 1.0)
|
32
32
|
omniauth-oauth2 (~> 1.0)
|
33
33
|
omniauth-oauth2 (1.1.1)
|
34
34
|
oauth2 (~> 0.8.0)
|
35
35
|
omniauth (~> 1.0)
|
36
36
|
rack (1.5.2)
|
37
|
-
rack-protection (1.
|
37
|
+
rack-protection (1.5.0)
|
38
38
|
rack
|
39
39
|
sinatra (1.3.5)
|
40
40
|
rack (~> 1.4)
|
41
41
|
rack-protection (~> 1.3)
|
42
42
|
tilt (~> 1.3, >= 1.3.3)
|
43
|
-
tilt (1.3.
|
43
|
+
tilt (1.3.5)
|
44
44
|
|
45
45
|
PLATFORMS
|
46
46
|
ruby
|
data/README.md
CHANGED
@@ -12,7 +12,7 @@ requires Heroku OAuth on all requests.
|
|
12
12
|
heroku clients:create likeaboss https://likeaboss.herokuapp.com/auth/heroku/callback
|
13
13
|
```
|
14
14
|
|
15
|
-
2. Set `
|
15
|
+
2. Set `HEROKU_OAUTH_ID` and `HEROKU_OAUTH_SECRET` in your environment.
|
16
16
|
3. Use the middleware:
|
17
17
|
|
18
18
|
```ruby
|
@@ -54,6 +54,20 @@ the following keys to your request environment:
|
|
54
54
|
|
55
55
|
You can access this in your Rack app by reading `request.env[key]`.
|
56
56
|
|
57
|
+
## Using the Heroku API
|
58
|
+
|
59
|
+
If you set `expose_token` to `true`, you'll get an API token that you
|
60
|
+
can use to make Heroku API calls on behalf of the logged-in user using
|
61
|
+
[heroku.rb](https://github.com/heroku/heroku.rb).
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
heroku = Heroku::API.new(:api_key => request.env["bouncer.token"])
|
65
|
+
apps = heroku.get_apps.body
|
66
|
+
```
|
67
|
+
|
68
|
+
Keep in mind that this adds substantial security risk to your
|
69
|
+
application.
|
70
|
+
|
57
71
|
## Logging out
|
58
72
|
|
59
73
|
Send users to `/auth/sso-logout` if logging out of Heroku is
|
data/lib/heroku/bouncer.rb
CHANGED
@@ -7,43 +7,39 @@ Heroku ||= Module.new
|
|
7
7
|
|
8
8
|
class Heroku::Bouncer < Sinatra::Base
|
9
9
|
|
10
|
+
$stderr.puts "[warn] heroku-bouncer: HEROKU_ID detected, please use HEROKU_OAUTH_ID instead" if ENV.has_key?('HEROKU_ID')
|
11
|
+
$stderr.puts "[warn] heroku-bouncer: HEROKU_SECRET detected, please use HEROKU_OAUTH_SECRET instead" if ENV.has_key?('HEROKU_SECRET')
|
12
|
+
|
13
|
+
ID = (ENV['HEROKU_OAUTH_ID'] || ENV['HEROKU_ID']).to_s
|
14
|
+
SECRET = (ENV['HEROKU_OAUTH_SECRET'] || ENV['HEROKU_SECRET']).to_s
|
15
|
+
|
10
16
|
enable :sessions
|
11
|
-
set :session_secret,
|
17
|
+
set :session_secret, ID + SECRET
|
12
18
|
|
13
19
|
# sets up the /auth/heroku endpoint
|
14
|
-
|
15
|
-
|
20
|
+
unless ID.empty? || SECRET.empty?
|
21
|
+
use OmniAuth::Builder do
|
22
|
+
provider :heroku, ID, SECRET
|
23
|
+
end
|
16
24
|
end
|
17
25
|
|
18
26
|
def initialize(app, options = {})
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
MultiJson.decode(
|
32
|
-
Faraday.new(ENV["HEROKU_API_URL"] || "https://api.heroku.com/").get('/account') do |r|
|
33
|
-
r.headers['Accept'] = 'application/json'
|
34
|
-
r.headers['Authorization'] = "Bearer #{token}"
|
35
|
-
end.body)
|
36
|
-
end
|
37
|
-
|
38
|
-
def store(key, value)
|
39
|
-
session[:store] ||= {}
|
40
|
-
session[:store][key] = value
|
27
|
+
if ID.empty? || SECRET.empty?
|
28
|
+
$stderr.puts "[fatal] heroku-bouncer: HEROKU_OAUTH_ID or HEROKU_OAUTH_SECRET not set, middleware disabled"
|
29
|
+
@app = app
|
30
|
+
@disabled = true
|
31
|
+
# super is not called; we're not using sinatra if we're disabled
|
32
|
+
else
|
33
|
+
super(app)
|
34
|
+
@herokai_only = extract_option(options, :herokai_only, false)
|
35
|
+
@expose_token = extract_option(options, :expose_token, false)
|
36
|
+
@expose_email = extract_option(options, :expose_email, true)
|
37
|
+
@expose_user = extract_option(options, :expose_user, true)
|
38
|
+
end
|
41
39
|
end
|
42
40
|
|
43
|
-
def
|
44
|
-
|
45
|
-
request.env["bouncer.#{key}"] = value
|
46
|
-
end
|
41
|
+
def call(env)
|
42
|
+
@disabled ? @app.call(env) : super(env)
|
47
43
|
end
|
48
44
|
|
49
45
|
before do
|
@@ -82,7 +78,7 @@ class Heroku::Bouncer < Sinatra::Base
|
|
82
78
|
# logout, single sign-on style
|
83
79
|
get '/auth/sso-logout' do
|
84
80
|
session.destroy
|
85
|
-
auth_url = ENV["HEROKU_AUTH_URL"] || "https://
|
81
|
+
auth_url = ENV["HEROKU_AUTH_URL"] || "https://id.heroku.com"
|
86
82
|
redirect to("#{auth_url}/logout")
|
87
83
|
end
|
88
84
|
|
@@ -92,4 +88,29 @@ class Heroku::Bouncer < Sinatra::Base
|
|
92
88
|
redirect to("/")
|
93
89
|
end
|
94
90
|
|
91
|
+
private
|
92
|
+
|
93
|
+
def extract_option(options, option, default = nil)
|
94
|
+
options.has_key?(option) ? options[option] : default
|
95
|
+
end
|
96
|
+
|
97
|
+
def fetch_user(token)
|
98
|
+
MultiJson.decode(
|
99
|
+
Faraday.new(ENV["HEROKU_API_URL"] || "https://api.heroku.com/").get('/account') do |r|
|
100
|
+
r.headers['Accept'] = 'application/json'
|
101
|
+
r.headers['Authorization'] = "Bearer #{token}"
|
102
|
+
end.body)
|
103
|
+
end
|
104
|
+
|
105
|
+
def store(key, value)
|
106
|
+
session[:store] ||= {}
|
107
|
+
session[:store][key] = value
|
108
|
+
end
|
109
|
+
|
110
|
+
def expose_store
|
111
|
+
session[:store].each_pair do |key, value|
|
112
|
+
request.env["bouncer.#{key}"] = value
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
95
116
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: heroku-bouncer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: omniauth-heroku
|