sinatra_auth_github 0.1.1 → 0.1.2
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/README.md +37 -39
- data/lib/sinatra/auth/github.rb +24 -10
- data/sinatra_auth_github.gemspec +2 -2
- data/spec/app.rb +1 -1
- metadata +7 -7
    
        data/README.md
    CHANGED
    
    | @@ -3,58 +3,56 @@ sinatra_auth_github | |
| 3 3 |  | 
| 4 4 | 
             
            A sinatra extension that provides oauth authentication to github.  Find out more about enabling your application at github's [oauth quickstart](http://gist.github.com/419219).
         | 
| 5 5 |  | 
| 6 | 
            -
            To test it out on localhost set your callback url to 'http://localhost: | 
| 6 | 
            +
            To test it out on localhost set your callback url to 'http://localhost:9393/auth/github/callback'
         | 
| 7 7 |  | 
| 8 | 
            -
             | 
| 8 | 
            +
            The gist of this project is to provide a few things easily:
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            * authenticate a user against github's oauth service
         | 
| 11 | 
            +
            * provide an easy way to make API requests for the authenticated user
         | 
| 12 | 
            +
            * optionally restrict users to a specific github organization
         | 
| 13 | 
            +
            * optionally restrict users to a specific github team
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            Installation
         | 
| 16 | 
            +
            ============
         | 
| 9 17 |  | 
| 10 | 
            -
             | 
| 18 | 
            +
                % gem install sinatra_auth_github
         | 
| 11 19 |  | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 20 | 
            +
            Running the Example
         | 
| 21 | 
            +
            ===================
         | 
| 14 22 | 
             
                % gem install bundler
         | 
| 15 23 | 
             
                % bundle install
         | 
| 16 | 
            -
                % GITHUB_CLIENT_ID="<from GH>" GITHUB_CLIENT_SECRET="<from GH>" bundle exec  | 
| 24 | 
            +
                % GITHUB_CLIENT_ID="<from GH>" GITHUB_CLIENT_SECRET="<from GH>" bundle exec rackup -p9393
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            There's an example app in [spec/app.rb](/atmos/sinatra_auth_github/blob/master/spec/app.rb).
         | 
| 17 27 |  | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
              class App < Sinatra::Base
         | 
| 21 | 
            -
                enable :sessions
         | 
| 28 | 
            +
            Example App Functionality
         | 
| 29 | 
            +
            =========================
         | 
| 22 30 |  | 
| 23 | 
            -
             | 
| 24 | 
            -
                                        # GitHub Provided secrets
         | 
| 25 | 
            -
                                        :secret       => ENV['GITHUB_CLIENT_SECRET'],
         | 
| 26 | 
            -
                                        :client_id    => ENV['GITHUB_CLIENT_ID'],
         | 
| 31 | 
            +
            You can simply authenticate via GitHub by hitting http://localhost:9292
         | 
| 27 32 |  | 
| 28 | 
            -
             | 
| 29 | 
            -
                                        :scopes       => 'user,offline_access',
         | 
| 33 | 
            +
            You can check organization membership by hitting http://localhost:9292/orgs/github
         | 
| 30 34 |  | 
| 31 | 
            -
             | 
| 32 | 
            -
                                        :organization => "github",
         | 
| 35 | 
            +
            You can check team membership by hitting http://localhost:9292/teams/42
         | 
| 33 36 |  | 
| 34 | 
            -
             | 
| 35 | 
            -
                                        :team         => nil # || 42
         | 
| 36 | 
            -
                                      }
         | 
| 37 | 
            +
            All unsuccessful authentication requests get sent to the securocat denied page.
         | 
| 37 38 |  | 
| 38 | 
            -
             | 
| 39 | 
            +
            API Requests
         | 
| 40 | 
            +
            ============
         | 
| 39 41 |  | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
                end
         | 
| 42 | 
            +
            The extension also provides a simple way to do get requests against the
         | 
| 43 | 
            +
            GitHub API as the authenticated user.
         | 
| 43 44 |  | 
| 44 | 
            -
                 | 
| 45 | 
            -
                   | 
| 46 | 
            -
                    github_request("repos/show/#{github_user.login}")
         | 
| 47 | 
            -
                  end
         | 
| 45 | 
            +
                def repos
         | 
| 46 | 
            +
                  github_request("user/repos")
         | 
| 48 47 | 
             
                end
         | 
| 49 48 |  | 
| 50 | 
            -
             | 
| 51 | 
            -
                  "Hello There, #{github_user.name}!#{github_user.token}\n#{repos.inspect}"
         | 
| 52 | 
            -
                end
         | 
| 49 | 
            +
            There's awesome docs on the v3 API [available here](http://developer.github.com/v3/).
         | 
| 53 50 |  | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 60 | 
            -
             | 
| 51 | 
            +
            Extension Options
         | 
| 52 | 
            +
            =================
         | 
| 53 | 
            +
             | 
| 54 | 
            +
            * `:scopes`       - The OAuth2 scopes you require, [Learn More](http://gist.github.com/419219)
         | 
| 55 | 
            +
            * `:secret`       - The client secret that GitHub provides
         | 
| 56 | 
            +
            * `:client_id`    - The client id that GitHub provides
         | 
| 57 | 
            +
            * `:failure_app`  - A Sinatra::Base class that has a route for `/authenticated`, Useful for overriding the securocat default page.
         | 
| 58 | 
            +
            * `:callback_url` - The path that GitHub posts back to, defaults to `/auth/github/callback`.
         | 
    
        data/lib/sinatra/auth/github.rb
    CHANGED
    
    | @@ -5,14 +5,17 @@ require 'rest_client' | |
| 5 5 | 
             
            module Sinatra
         | 
| 6 6 | 
             
              module Auth
         | 
| 7 7 | 
             
                module Github
         | 
| 8 | 
            -
                  VERSION = "0.1. | 
| 8 | 
            +
                  VERSION = "0.1.2"
         | 
| 9 9 |  | 
| 10 | 
            +
                  # Simple way to serve an image early in the stack and not get blocked by
         | 
| 11 | 
            +
                  # application level before filters
         | 
| 10 12 | 
             
                  class AccessDenied < Sinatra::Base
         | 
| 11 13 | 
             
                    get '/_images/securocat.png' do
         | 
| 12 14 | 
             
                      send_file(File.join(File.dirname(__FILE__), "views", "securocat.png"))
         | 
| 13 15 | 
             
                    end
         | 
| 14 16 | 
             
                  end
         | 
| 15 17 |  | 
| 18 | 
            +
                  # The default failure application, this is overridable from the extension config
         | 
| 16 19 | 
             
                  class BadAuthentication < Sinatra::Base
         | 
| 17 20 | 
             
                    helpers do
         | 
| 18 21 | 
             
                      def unauthorized_template
         | 
| @@ -43,6 +46,9 @@ module Sinatra | |
| 43 46 | 
             
                      warden.logout
         | 
| 44 47 | 
             
                    end
         | 
| 45 48 |  | 
| 49 | 
            +
                    # The authenticated user object
         | 
| 50 | 
            +
                    #
         | 
| 51 | 
            +
                    # Supports a variety of methods, name, full_name, email, etc
         | 
| 46 52 | 
             
                    def github_user
         | 
| 47 53 | 
             
                      warden.user
         | 
| 48 54 | 
             
                    end
         | 
| @@ -81,7 +87,7 @@ module Sinatra | |
| 81 87 | 
             
                    def github_organization_access?(name)
         | 
| 82 88 | 
             
                      orgs = github_request("orgs/#{name}/members")
         | 
| 83 89 | 
             
                      orgs.map { |org| org["login"] }.include?(github_user.login)
         | 
| 84 | 
            -
                    rescue RestClient::Unauthorized, RestClient::ResourceNotFound => e
         | 
| 90 | 
            +
                    rescue RestClient::Forbidden, RestClient::Unauthorized, RestClient::ResourceNotFound => e
         | 
| 85 91 | 
             
                      false
         | 
| 86 92 | 
             
                    end
         | 
| 87 93 |  | 
| @@ -93,16 +99,25 @@ module Sinatra | |
| 93 99 | 
             
                    def github_team_access?(team_id)
         | 
| 94 100 | 
             
                      members = github_request("teams/#{team_id}/members")
         | 
| 95 101 | 
             
                      members.map { |user| user["login"] }.include?(github_user.login)
         | 
| 96 | 
            -
                    rescue RestClient::Unauthorized, RestClient::ResourceNotFound => e
         | 
| 102 | 
            +
                    rescue RestClient::Forbidden, RestClient::Unauthorized, RestClient::ResourceNotFound => e
         | 
| 97 103 | 
             
                      false
         | 
| 98 104 | 
             
                    end
         | 
| 99 105 |  | 
| 100 | 
            -
                    #  | 
| 106 | 
            +
                    # Enforce user membership to the named organization
         | 
| 107 | 
            +
                    #
         | 
| 108 | 
            +
                    # name - the organization to test membership against
         | 
| 109 | 
            +
                    #
         | 
| 110 | 
            +
                    # Returns an execution halt if the user is not a member of the named org
         | 
| 101 111 | 
             
                    def github_organization_authenticate!(name)
         | 
| 102 112 | 
             
                      authenticate!
         | 
| 103 113 | 
             
                      halt([401, "Unauthorized User"]) unless github_organization_access?(name)
         | 
| 104 114 | 
             
                    end
         | 
| 105 115 |  | 
| 116 | 
            +
                    # Enforce user membership to the team id
         | 
| 117 | 
            +
                    #
         | 
| 118 | 
            +
                    # team_id - the team_id to test membership against
         | 
| 119 | 
            +
                    #
         | 
| 120 | 
            +
                    # Returns an execution halt if the user is not a member of the team
         | 
| 106 121 | 
             
                    def github_team_authenticate!(team_id)
         | 
| 107 122 | 
             
                      authenticate!
         | 
| 108 123 | 
             
                      halt([401, "Unauthorized User"]) unless github_team_access?(team_id)
         | 
| @@ -120,10 +135,9 @@ module Sinatra | |
| 120 135 |  | 
| 121 136 | 
             
                      manager.failure_app           = app.github_options[:failure_app] || BadAuthentication
         | 
| 122 137 |  | 
| 123 | 
            -
                      manager[:github_secret]       = app.github_options[:secret]
         | 
| 124 | 
            -
                      manager[:github_scopes]       = app.github_options[:scopes] | 
| 125 | 
            -
                      manager[:github_client_id]    = app.github_options[:client_id]
         | 
| 126 | 
            -
                      manager[:github_organization] = app.github_options[:organization] || nil
         | 
| 138 | 
            +
                      manager[:github_secret]       = app.github_options[:secret]       || ENV['GITHUB_CLIENT_SECRET']
         | 
| 139 | 
            +
                      manager[:github_scopes]       = app.github_options[:scopes]       || 'email,offline_access'
         | 
| 140 | 
            +
                      manager[:github_client_id]    = app.github_options[:client_id]    || ENV['GITHUB_CLIENT_ID']
         | 
| 127 141 | 
             
                      manager[:github_callback_url] = app.github_options[:callback_url] || '/auth/github/callback'
         | 
| 128 142 | 
             
                    end
         | 
| 129 143 |  | 
| @@ -131,9 +145,9 @@ module Sinatra | |
| 131 145 |  | 
| 132 146 | 
             
                    app.get '/auth/github/callback' do
         | 
| 133 147 | 
             
                      authenticate!
         | 
| 134 | 
            -
                       | 
| 148 | 
            +
                      return_to = session.delete('return_to') || _relative_url_for('/')
         | 
| 149 | 
            +
                      redirect return_to
         | 
| 135 150 | 
             
                    end
         | 
| 136 | 
            -
             | 
| 137 151 | 
             
                  end
         | 
| 138 152 | 
             
                end
         | 
| 139 153 | 
             
              end
         | 
    
        data/sinatra_auth_github.gemspec
    CHANGED
    
    | @@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__) | |
| 3 3 |  | 
| 4 4 | 
             
            Gem::Specification.new do |s|
         | 
| 5 5 | 
             
              s.name        = "sinatra_auth_github"
         | 
| 6 | 
            -
              s.version     = "0.1. | 
| 6 | 
            +
              s.version     = "0.1.2"
         | 
| 7 7 | 
             
              s.platform    = Gem::Platform::RUBY
         | 
| 8 8 | 
             
              s.authors     = ["Corey Donohoe"]
         | 
| 9 9 | 
             
              s.email       = ["atmos@atmos.org"]
         | 
| @@ -15,7 +15,7 @@ Gem::Specification.new do |s| | |
| 15 15 |  | 
| 16 16 | 
             
              s.add_dependency "sinatra",       "~>1.0"
         | 
| 17 17 | 
             
              s.add_dependency "rest-client",   "~>1.6.1"
         | 
| 18 | 
            -
              s.add_dependency "warden-github", "~>0.1. | 
| 18 | 
            +
              s.add_dependency "warden-github", "~>0.1.1"
         | 
| 19 19 |  | 
| 20 20 | 
             
              s.add_development_dependency "rake"
         | 
| 21 21 | 
             
              s.add_development_dependency "rspec",     "~>1.3.0"
         | 
    
        data/spec/app.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,13 +1,13 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: sinatra_auth_github
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              hash:  | 
| 4 | 
            +
              hash: 31
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
              segments: 
         | 
| 7 7 | 
             
              - 0
         | 
| 8 8 | 
             
              - 1
         | 
| 9 | 
            -
              -  | 
| 10 | 
            -
              version: 0.1. | 
| 9 | 
            +
              - 2
         | 
| 10 | 
            +
              version: 0.1.2
         | 
| 11 11 | 
             
            platform: ruby
         | 
| 12 12 | 
             
            authors: 
         | 
| 13 13 | 
             
            - Corey Donohoe
         | 
| @@ -15,7 +15,7 @@ autorequire: | |
| 15 15 | 
             
            bindir: bin
         | 
| 16 16 | 
             
            cert_chain: []
         | 
| 17 17 |  | 
| 18 | 
            -
            date: 2011-06- | 
| 18 | 
            +
            date: 2011-06-27 00:00:00 -07:00
         | 
| 19 19 | 
             
            default_executable: 
         | 
| 20 20 | 
             
            dependencies: 
         | 
| 21 21 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| @@ -57,12 +57,12 @@ dependencies: | |
| 57 57 | 
             
                requirements: 
         | 
| 58 58 | 
             
                - - ~>
         | 
| 59 59 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 60 | 
            -
                    hash:  | 
| 60 | 
            +
                    hash: 25
         | 
| 61 61 | 
             
                    segments: 
         | 
| 62 62 | 
             
                    - 0
         | 
| 63 63 | 
             
                    - 1
         | 
| 64 | 
            -
                    -  | 
| 65 | 
            -
                    version: 0.1. | 
| 64 | 
            +
                    - 1
         | 
| 65 | 
            +
                    version: 0.1.1
         | 
| 66 66 | 
             
              type: :runtime
         | 
| 67 67 | 
             
              version_requirements: *id003
         | 
| 68 68 | 
             
            - !ruby/object:Gem::Dependency 
         |