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.
Files changed (4) hide show
  1. data/Gemfile.lock +6 -6
  2. data/README.md +15 -1
  3. data/lib/heroku/bouncer.rb +51 -30
  4. metadata +2 -2
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- heroku-bouncer (0.0.2.pre)
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.5)
18
- multi_json (>= 1.0)
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.0)
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.4.0)
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.4)
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 `HEROKU_ID` and `HEROKU_SECRET` in your environment.
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
@@ -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, ENV['HEROKU_ID'].to_s + ENV['HEROKU_SECRET'].to_s
17
+ set :session_secret, ID + SECRET
12
18
 
13
19
  # sets up the /auth/heroku endpoint
14
- use OmniAuth::Builder do
15
- provider :heroku, ENV['HEROKU_ID'], ENV['HEROKU_SECRET']
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
- super(app)
20
- @herokai_only = extract_option(options, :herokai_only, false)
21
- @expose_token = extract_option(options, :expose_token, false)
22
- @expose_email = extract_option(options, :expose_email, true)
23
- @expose_user = extract_option(options, :expose_user, true)
24
- end
25
-
26
- def extract_option(options, option, default = nil)
27
- options.has_key?(option) ? options[option] : default
28
- end
29
-
30
- def fetch_user(token)
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 expose_store
44
- session[:store].each_pair do |key, value|
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://api.heroku.com"
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.1.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-09 00:00:00.000000000 Z
12
+ date: 2013-03-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: omniauth-heroku