auth-proxy 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6ec8a799dae3f536a97750c0ec0557227796d3c4
4
+ data.tar.gz: 8b091ef9d05342311a9193828a739ac942b5c705
5
+ SHA512:
6
+ metadata.gz: 5f48c6d8f308389a11e68282fdfcc6d85230233c34f43acaa68d0e62c5cbe40dc3f6edadb619f0f9d53bc3d0c48be23c0f633e659ea1eaa328d56ba836e90f22
7
+ data.tar.gz: 28ef27de81f690ba78dc29010427992290af057cbe0ec8bdfde54436104c43ef8ae7ff2121620896dca6f6ab25ee5a60e914da3c18514a3fe2ef536f16b34136
@@ -0,0 +1,8 @@
1
+ example/
2
+ .DS_Store
3
+ /.bundle
4
+ *.orig
5
+ *.swp
6
+ .powrc
7
+ *.local
8
+ pkg/
@@ -0,0 +1,94 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.3
3
+ # RuboCop has a bunch of cops enabled by default. This setting tells RuboCop
4
+ # to ignore them, so only the ones explicitly set in this file are enabled.
5
+ DisabledByDefault: true
6
+ Exclude:
7
+ - '**/templates/**/*'
8
+ - '**/vendor/**/*'
9
+
10
+ # Prefer &&/|| over and/or.
11
+ Style/AndOr:
12
+ Enabled: true
13
+
14
+ # Do not use braces for hash literals when they are the last argument of a
15
+ # method call.
16
+ Style/BracesAroundHashParameters:
17
+ Enabled: true
18
+
19
+ # Align `when` with `case`.
20
+ Style/CaseIndentation:
21
+ Enabled: true
22
+
23
+ # No extra empty lines.
24
+ Style/EmptyLines:
25
+ Enabled: true
26
+
27
+ # In a regular class definition, no empty lines around the body.
28
+ Style/EmptyLinesAroundClassBody:
29
+ Enabled: true
30
+
31
+ # In a regular module definition, no empty lines around the body.
32
+ Style/EmptyLinesAroundModuleBody:
33
+ Enabled: true
34
+
35
+ # Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
36
+ Style/HashSyntax:
37
+ Enabled: true
38
+
39
+ # Method definitions after `private` or `protected` isolated calls need one
40
+ # extra level of indentation.
41
+ Style/IndentationConsistency:
42
+ Enabled: true
43
+ EnforcedStyle: normal
44
+
45
+ # Two spaces, no tabs (for indentation).
46
+ Style/IndentationWidth:
47
+ Enabled: true
48
+
49
+ # Defining a method with parameters needs parentheses.
50
+ Style/MethodDefParentheses:
51
+ Enabled: true
52
+
53
+ # Use `foo {}` not `foo{}`.
54
+ Style/SpaceBeforeBlockBraces:
55
+ Enabled: true
56
+
57
+ # Use `foo { bar }` not `foo {bar}`.
58
+ Style/SpaceInsideBlockBraces:
59
+ Enabled: true
60
+
61
+ # Use `{ a: 1 }` not `{a:1}`.
62
+ Style/SpaceInsideHashLiteralBraces:
63
+ Enabled: true
64
+
65
+ # Check quotes usage according to lint rule below.
66
+ Style/StringLiterals:
67
+ Enabled: true
68
+ EnforcedStyle: double_quotes
69
+
70
+ # Detect hard tabs, no hard tabs.
71
+ Style/Tab:
72
+ Enabled: true
73
+
74
+ # Blank lines should not have any spaces.
75
+ Style/TrailingBlankLines:
76
+ Enabled: true
77
+
78
+ # No trailing whitespace.
79
+ Style/TrailingWhitespace:
80
+ Enabled: true
81
+
82
+ # Use quotes for string literals when they are enough.
83
+ Style/UnneededPercentQ:
84
+ Enabled: true
85
+
86
+ # Align `end` with the matching keyword or starting expression except for
87
+ # assignments, where it should be aligned with the LHS.
88
+ Lint/EndAlignment:
89
+ Enabled: true
90
+ AlignWith: variable
91
+
92
+ # Use my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
93
+ Lint/RequireParentheses:
94
+ Enabled: true
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "omniauth-vsts"
4
+ gem "better_errors"
5
+ gem "binding_of_caller"
6
+
7
+ gemspec
@@ -0,0 +1,65 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ auth-proxy (1.0.0)
5
+ json
6
+ sinatra
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ better_errors (2.1.1)
12
+ coderay (>= 1.0.0)
13
+ erubis (>= 2.6.6)
14
+ rack (>= 0.9.0)
15
+ binding_of_caller (0.7.2)
16
+ debug_inspector (>= 0.0.1)
17
+ coderay (1.1.1)
18
+ debug_inspector (0.0.2)
19
+ erubis (2.7.0)
20
+ faraday (0.9.2)
21
+ multipart-post (>= 1.2, < 3)
22
+ hashie (3.4.6)
23
+ json (2.0.2)
24
+ jwt (1.5.6)
25
+ multi_json (1.12.1)
26
+ multi_xml (0.6.0)
27
+ multipart-post (2.0.0)
28
+ oauth2 (1.2.0)
29
+ faraday (>= 0.8, < 0.10)
30
+ jwt (~> 1.0)
31
+ multi_json (~> 1.3)
32
+ multi_xml (~> 0.5)
33
+ rack (>= 1.2, < 3)
34
+ omniauth (1.3.1)
35
+ hashie (>= 1.2, < 4)
36
+ rack (>= 1.0, < 3)
37
+ omniauth-oauth2 (1.4.0)
38
+ oauth2 (~> 1.0)
39
+ omniauth (~> 1.2)
40
+ omniauth-vsts (0.1.0)
41
+ omniauth (~> 1.0)
42
+ omniauth-oauth2 (>= 1.1.1)
43
+ rack (1.6.5)
44
+ rack-protection (1.5.3)
45
+ rack
46
+ rake (10.5.0)
47
+ sinatra (1.4.7)
48
+ rack (~> 1.5)
49
+ rack-protection (~> 1.4)
50
+ tilt (>= 1.3, < 3)
51
+ tilt (2.0.5)
52
+
53
+ PLATFORMS
54
+ ruby
55
+
56
+ DEPENDENCIES
57
+ auth-proxy!
58
+ better_errors
59
+ binding_of_caller
60
+ bundler (~> 1.13)
61
+ omniauth-vsts
62
+ rake (~> 10.0)
63
+
64
+ BUNDLED WITH
65
+ 1.13.6
@@ -0,0 +1,145 @@
1
+ # Auth::Proxy
2
+
3
+ External auth for your web services.
4
+
5
+ IMPORTANT: This is still under development and untested
6
+
7
+ ## Usage
8
+
9
+ Create a directorry for your auth-proxy app.
10
+
11
+ Create a Gemfile and add the auth-proxy gem and any omniauth gems you want to use:
12
+
13
+ ```ruby
14
+ gem "auth-proxy"
15
+ gem "omniauth-facebook"
16
+ gem "omniauth-twitter"
17
+ ```
18
+
19
+ And then execute:
20
+
21
+ $ bundle install
22
+
23
+ Create a config.ru file:
24
+
25
+ ```ruby
26
+ require "auth-proxy"
27
+ require "omniauth-facebook"
28
+
29
+ AuthProxy.configure do |config|
30
+ config.ssl = true
31
+ config.register :facebook,
32
+ display_name: "Facebook",
33
+ app_id: "ID",
34
+ app_secret: "SECRET"
35
+ end
36
+
37
+ run AuthProxy.app
38
+ ```
39
+
40
+ And then execute
41
+
42
+ $ AUTH_PROXY_APP_DOMAIN=auth.my.domain AUTH_PROXY_COOKIE_DOMAIN=my.domain rackup config.ru
43
+
44
+
45
+ Now you can proxy requests through this app to be authenticated. One nice way of doing this is using nginx's
46
+ `auth_request` directive. Assuming you have different services under ops.company.tld domain
47
+ (service1.ops.company.tld service2.ops.company.tld etc) you would setup auth-proxy to run under
48
+ auth.ops.company.tld and keep the cookies under ops.company.tld so they will be available on all services:
49
+
50
+ $ AUTH_PROXY_APP_DOMAIN=auth.ops.company.tld AUTH_PROXY_COOKIE_DOMAIN=ops.company.tld rackup -p 5000 config.ru
51
+
52
+ In front of the auth-proxy you will have an nginx (or more nginx loadbalancers) with the following config:
53
+
54
+ ```
55
+ worker_processes 1;
56
+
57
+ events {
58
+ worker_connections 1024;
59
+ }
60
+
61
+ http {
62
+ upstream auth {
63
+ server 127.0.0.1:6000 fail_timeout=0;
64
+ }
65
+
66
+ server {
67
+ listen 80;
68
+ server_name auth.ops.company.tld;
69
+
70
+ location / {
71
+ proxy_pass http://auth;
72
+ proxy_set_header Host $http_host;
73
+ proxy_set_header X-Real-IP $remote_addr;
74
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
75
+ proxy_set_header X-Forwarded-Proto $scheme;
76
+ }
77
+ }
78
+ }
79
+ ```
80
+
81
+ Now for each app that needs to be authenticated you will need a nginx in front of it with the following
82
+ config:
83
+
84
+ ```
85
+ worker_processes 1;
86
+
87
+ events {
88
+ worker_connections 1024;
89
+ }
90
+
91
+ http {
92
+ upstream service1 {
93
+ server 127.0.0.1:7000 fail_timeout=0;
94
+ }
95
+
96
+
97
+ server {
98
+ listen 7000;
99
+ server_name service1.ops.company.tld;
100
+
101
+ auth_request /auth/try;
102
+
103
+ # optional - if you need to pass to your app headers set by the auth-proxy
104
+ auth_request_set $auth_proxy_user_name $upstream_http_x_auth_proxy_user_name;
105
+ auth_request_set $auth_proxy_user_email $upstream_http_x_auth_proxy_user_email;
106
+ auth_request_set $auth_proxy_user_id $upstream_http_x_auth_proxy_user_id;
107
+ auth_request_set $auth_proxy_user_provider $upstream_http_x_auth_proxy_user_provider;
108
+ auth_request_set $auth_proxy_user_token $upstream_http_x_auth_proxy_user_token;
109
+ # optional end
110
+
111
+ error_page 401 403 =200 @login;
112
+ location @login {
113
+ return 301 https://auth.ops.company.tld/login?return_to=https://$http_host$request_uri;
114
+ }
115
+
116
+ location = /auth/try {
117
+ proxy_pass http://auth..ops.company.tld;
118
+ proxy_pass_request_body off;
119
+ proxy_set_header Content-Length "";
120
+ }
121
+
122
+ location / {
123
+ proxy_pass http://service1;
124
+ proxy_set_header Host $http_host;
125
+ proxy_set_header X-Real-IP $remote_addr;
126
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
127
+ proxy_set_header X-Forwarded-Proto $scheme;
128
+ # optional - if you need to pass to your app headers set by the auth-proxy
129
+ proxy_set_header X-Auth-Proxy-User-Name $auth_proxy_user_name;
130
+ proxy_set_header X-Auth-Proxy-User-Email $auth_proxy_user_email;
131
+ proxy_set_header X-Auth-Proxy-User-ID $auth_proxy_user_id;
132
+ proxy_set_header X-Auth-Proxy-User-provider $auth_proxy_user_provider;
133
+ proxy_set_header X-Auth-Proxy-User-token $auth_proxy_user_token;
134
+ # optional end
135
+ }
136
+ }
137
+
138
+ }
139
+ ```
140
+
141
+
142
+ ## Contributing
143
+
144
+ Bug reports and pull requests are welcome on GitHub at https://github.com/cristianbica/auth-proxy.
145
+
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "auth_proxy/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "auth-proxy"
8
+ spec.version = AuthProxy::VERSION
9
+ spec.authors = ["Cristian Bica"]
10
+ spec.email = ["cristian.bica@gmail.com"]
11
+
12
+ spec.summary = "Auth Proxy App"
13
+ spec.description = "Auth Proxy App (supports user / pass, oauth2)"
14
+ spec.homepage = "https://github.com/cristianbica/auth-proxy"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "sinatra"
22
+ spec.add_dependency "json"
23
+ spec.add_development_dependency "bundler", "~> 1.13"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ end
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "auth_proxy"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1 @@
1
+ require "auth_proxy"
@@ -0,0 +1,59 @@
1
+ require "auth_proxy/version"
2
+ require "auth_proxy/config"
3
+ require "auth_proxy/errors"
4
+ require "auth_proxy/app"
5
+
6
+ module AuthProxy
7
+ def self.configure(&block)
8
+ yield @config ||= AuthProxy::Config.new
9
+ end
10
+
11
+ def self.config
12
+ @config
13
+ end
14
+
15
+ configure do |config|
16
+ config.app_domain = ENV["AUTH_PROXY_APP_DOMAIN"]
17
+ config.cookie_domain = ENV["AUTH_PROXY_COOKIE_DOMAIN"]
18
+ config.ssl = false
19
+ end
20
+
21
+ def self.root_path
22
+ File.expand_path("../../", __FILE__)
23
+ end
24
+
25
+ def self.full_url
26
+ URI::Generic.build(
27
+ scheme: config.ssl ? "https" : "http",
28
+ host: config.app_domain
29
+ ).to_s
30
+ end
31
+
32
+ def self.validate_auth_request(provider, request)
33
+ validator = config.providers[provider.to_s][:validator]
34
+ validator.call(request) unless validator.nil?
35
+ end
36
+
37
+ def self.app
38
+ Sinatra.new(AuthProxy::App) do
39
+ use Rack::Session::Cookie, key: "rack.session",
40
+ domain: "." + AuthProxy.config.cookie_domain,
41
+ path: "/",
42
+ expire_after: 2592000,
43
+ secret: "a-secret"
44
+
45
+ set :views, AuthProxy.config.views_path || "#{AuthProxy.root_path}/views"
46
+
47
+ if AuthProxy.config.providers.any?
48
+ OmniAuth.config.full_host = AuthProxy.full_url
49
+ OmniAuth.config.failure_raise_out_environments = []
50
+ use OmniAuth::Builder do
51
+ AuthProxy.config.providers.each do |name, p|
52
+ provider p[:provider], p[:app_id], p[:app_secret], p[:options]
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ end
@@ -0,0 +1,72 @@
1
+ require "sinatra/base"
2
+ require "json"
3
+
4
+ class AuthProxy::App < Sinatra::Base
5
+ if ENV["RACK_ENV"] == "development"
6
+ begin
7
+ require "better_errors"
8
+ use BetterErrors::Middleware
9
+ BetterErrors.application_root = __dir__
10
+ rescue
11
+ end
12
+
13
+ set :show_exceptions, :after_handler
14
+ end
15
+
16
+ get "/auth/:provider/callback" do
17
+ AuthProxy.validate_auth_request(params[:provider], request)
18
+ oauth = request.env["omniauth.auth"]
19
+ session[:authenticated] = "true"
20
+ session[:user_name] = oauth.info.name
21
+ session[:user_email] = oauth.info.email
22
+ session[:user_id] = oauth.uid
23
+ session[:user_provider] = params[:provider]
24
+ session[:user_token] = oauth.credentials.token
25
+ redirect session[:return_to] ? session.delete(:return_to) : "/"
26
+ end
27
+
28
+ get "/auth/failure" do
29
+ session[:alert] = params[:message]
30
+ redirect "/login"
31
+ end
32
+
33
+ get "/auth/try" do
34
+ if session[:authenticated] == "true"
35
+ auth_proxy_headers = {}
36
+ %i{user_name user_email user_id user_provider user_token}.each do |key|
37
+ auth_proxy_headers["x_auth_proxy_#{key}".gsub("_", "-")] = session[key]
38
+ end
39
+ headers auth_proxy_headers
40
+ halt 200
41
+ else
42
+ halt 401
43
+ end
44
+ end
45
+
46
+ get "/login" do
47
+ session[:return_to] = params[:return_to] if params[:return_to]
48
+ if session[:authenticated] == "true"
49
+ redirect session[:return_to] ? session.delete(:return_to) : "/"
50
+ else
51
+ erb :login, layout: :layout
52
+ end
53
+ end
54
+
55
+ get "/logout" do
56
+ session.clear
57
+ redirect request.referer || "/login"
58
+ end
59
+
60
+ get "/" do
61
+ if session[:authenticated] == "true"
62
+ erb "You're authenticated. Now navigate to your app"
63
+ else
64
+ redirect "/login"
65
+ end
66
+ end
67
+
68
+ error AuthProxy::ProviderValidationError do
69
+ session[:alert] = "Could not validate your credentials"
70
+ redirect "/login"
71
+ end
72
+ end
@@ -0,0 +1,23 @@
1
+ class AuthProxy::Config
2
+ attr_accessor :app_domain
3
+ attr_accessor :cookie_domain
4
+ attr_accessor :providers
5
+ attr_accessor :ssl
6
+ attr_accessor :views_path
7
+
8
+ def initialize
9
+ self.providers = {}
10
+ end
11
+
12
+ def register(provider, display_name:, app_id:, app_secret:, options: {}, validator: nil)
13
+ options[:callback_path] ||= "/auth/#{provider}/callback"
14
+ providers[provider.to_s] = {
15
+ provider: provider,
16
+ display_name: display_name,
17
+ app_id: app_id,
18
+ app_secret: app_secret,
19
+ validator: validator,
20
+ options: options
21
+ }
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module AuthProxy
2
+ class ProviderValidationError < StandardError;end
3
+ end
@@ -0,0 +1,3 @@
1
+ module AuthProxy
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,28 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
7
+ <title>Auth</title>
8
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/css/bootstrap.min.css" integrity="sha384-AysaV+vQoT3kOAXZkl02PThvDr8HYKPZhNT5h/CXfBThSRXQ6jW5DO2ekP5ViFdi" crossorigin="anonymous">
9
+ <script src="https://code.jquery.com/jquery-3.1.1.js" integrity="sha256-16cdPddA6VdVInumRGo6IbivbERE8p7CQR3HzTBuELA=" crossorigin="anonymous"></script>
10
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/js/bootstrap.min.js" integrity="sha384-BLiI7JTZm+JWlgKa0M0kGRpJbF2J8q+qreVrKBC47e3K6BW78kGLrCkeRX6I9RoK" crossorigin="anonymous"></script>
11
+ </head>
12
+ <body>
13
+ <div class="container pt-2">
14
+ <% { alert: :danger, notice: :success }.each do |flash_type, alert_class| %>
15
+ <% if flash_message = session.delete(flash_type) %>
16
+
17
+ <div class="alert alert-<%= alert_class %> alert-dismissible fade in mb-2" role="alert">
18
+ <button type="button" class="close" data-dismiss="alert" aria-label="Close">
19
+ <span aria-hidden="true">&times;</span>
20
+ </button>
21
+ <%= flash_message %>
22
+ </div>
23
+ <% end %>
24
+ <% end %>
25
+ <%= yield %>
26
+ </div>
27
+ </body>
28
+ </html>
@@ -0,0 +1,9 @@
1
+ <div class="row">
2
+ <div class="col-xs-12 text-xs-center">
3
+ <% AuthProxy.config.providers.each do |name, provider| %>
4
+ <a href="/auth/<%= provider[:provider] %>" class="btn btn-primary">
5
+ Login with <%= provider[:display_name] %>
6
+ </a>
7
+ <% end %>
8
+ </div>
9
+ </div>
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: auth-proxy
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Cristian Bica
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-12-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sinatra
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.13'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.13'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ description: Auth Proxy App (supports user / pass, oauth2)
70
+ email:
71
+ - cristian.bica@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".rubocop.yml"
78
+ - Gemfile
79
+ - Gemfile.lock
80
+ - README.md
81
+ - Rakefile
82
+ - auth-proxy.gemspec
83
+ - bin/console
84
+ - bin/setup
85
+ - lib/auth-proxy.rb
86
+ - lib/auth_proxy.rb
87
+ - lib/auth_proxy/app.rb
88
+ - lib/auth_proxy/config.rb
89
+ - lib/auth_proxy/errors.rb
90
+ - lib/auth_proxy/version.rb
91
+ - views/layout.erb
92
+ - views/login.erb
93
+ homepage: https://github.com/cristianbica/auth-proxy
94
+ licenses: []
95
+ metadata: {}
96
+ post_install_message:
97
+ rdoc_options: []
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ requirements: []
111
+ rubyforge_project:
112
+ rubygems_version: 2.5.1
113
+ signing_key:
114
+ specification_version: 4
115
+ summary: Auth Proxy App
116
+ test_files: []