diff --git a/.travis.yml b/.travis.yml index 0dd44d3..06a8c5b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,11 +21,5 @@ matrix: - rvm: ruby-head include: - rvm: 2.2.6 - gemfile: gemfiles/nobrainer.rb - env: ORM=nobrainer - rvm: 2.3.3 - gemfile: gemfiles/nobrainer.rb - env: ORM=nobrainer - rvm: ruby-head - gemfile: gemfiles/nobrainer.rb - env: ORM=nobrainer diff --git a/Gemfile b/Gemfile index 23dfbd7..2079399 100644 --- a/Gemfile +++ b/Gemfile @@ -6,6 +6,7 @@ gem 'rack-oauth2' group :test do gem 'nobrainer' + gem 'nobrainer_simple_oauth2' gem 'coveralls', require: false gem 'ffaker' diff --git a/gemfiles/nobrainer.rb b/gemfiles/nobrainer.rb deleted file mode 100644 index 0ce610a..0000000 --- a/gemfiles/nobrainer.rb +++ /dev/null @@ -1,15 +0,0 @@ -source 'https://rubygems.org' - -gemspec path: '../' - -gem 'nobrainer' - -group :test do - gem 'coveralls', require: false - gem 'factory_girl', '~> 4.0' - gem 'ffaker' - gem 'rack-test', require: 'rack/test' - gem 'rspec-rails', '~> 3.4' -end - -gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] diff --git a/lib/simple_oauth2.rb b/lib/simple_oauth2.rb index 936e8d3..92e63a2 100644 --- a/lib/simple_oauth2.rb +++ b/lib/simple_oauth2.rb @@ -7,13 +7,6 @@ require 'simple_oauth2/uniq_token' require 'simple_oauth2/resource/bearer' -# Mixins -if defined?(NoBrainer::Document) - require 'simple_oauth2/mixins/nobrainer/access_token' - require 'simple_oauth2/mixins/nobrainer/access_grant' - require 'simple_oauth2/mixins/nobrainer/client' -end - # Authorization Grants aka Flows (Strategies) require 'simple_oauth2/strategies/base' require 'simple_oauth2/strategies/password' diff --git a/lib/simple_oauth2/configuration.rb b/lib/simple_oauth2/configuration.rb index b19790c..0e5bedb 100644 --- a/lib/simple_oauth2/configuration.rb +++ b/lib/simple_oauth2/configuration.rb @@ -113,7 +113,7 @@ def on_refresh(&block) # Validates token value passed with the request params def default_token_authenticator lambda do |request| - access_token_class.authenticate(request.access_token) || request.invalid_token! + access_token_class.by_token(request.access_token) || request.invalid_token! end end diff --git a/lib/simple_oauth2/generators/token.rb b/lib/simple_oauth2/generators/token.rb index ff84fd3..22e0f68 100644 --- a/lib/simple_oauth2/generators/token.rb +++ b/lib/simple_oauth2/generators/token.rb @@ -28,7 +28,7 @@ def generate_for(env, &_block) # @return [Response] with HTTP status code 200 # def revoke(token, env) - access_token = config.access_token_class.authenticate(token, 'refresh_token') + access_token = config.access_token_class.by_refresh_token(token) if access_token request = Rack::OAuth2::Server::Token::Request.new(env) diff --git a/lib/simple_oauth2/mixins/nobrainer/access_grant.rb b/lib/simple_oauth2/mixins/nobrainer/access_grant.rb deleted file mode 100644 index e121239..0000000 --- a/lib/simple_oauth2/mixins/nobrainer/access_grant.rb +++ /dev/null @@ -1,62 +0,0 @@ -module Simple - module OAuth2 - module NoBrainer - # Includes all the required API, associations, validations and callbacks - module AccessGrant - extend ActiveSupport::Concern - - included do # rubocop:disable Metrics/BlockLength - include ::NoBrainer::Document - include ::NoBrainer::Document::Timestamps - - belongs_to :client, class_name: Simple::OAuth2.config.client_class_name, - foreign_key: :client_id, primary_key: :id - belongs_to :resource_owner, class_name: Simple::OAuth2.config.resource_owner_class_name, - foreign_key: :resource_owner_id, primary_key: :id - - before_save { self.updated_at = Time.now } - before_validation :setup_expiration, if: :new_record? - - field :resource_owner_id, type: String, index: true, required: true - field :client_id, type: String, index: true, required: true - - field :token, - type: String, - required: true, - uniq: true, - index: true, - default: -> { Simple::OAuth2.config.token_generator.generate } - - field :redirect_uri, type: String, required: true - field :scopes, type: String - - field :revoked_at, type: Time - field :expires_at, type: Time, required: true - field :created_at, type: Time, required: true, default: -> { Time.now } - field :updated_at, type: Time, required: true, default: -> { Time.now } - - class << self - def create_for(client, resource_owner, redirect_uri, scopes = nil) - create( - client_id: client.id, - resource_owner_id: resource_owner.id, - redirect_uri: redirect_uri, - scopes: scopes - ) - end - - def authenticate(token) - where(token: token.to_s).first - end - end - - private - - def setup_expiration - self.expires_at = Time.now.utc + Simple::OAuth2.config.authorization_code_lifetime if expires_at.nil? - end - end - end - end - end -end diff --git a/lib/simple_oauth2/mixins/nobrainer/access_token.rb b/lib/simple_oauth2/mixins/nobrainer/access_token.rb deleted file mode 100644 index 26cccc7..0000000 --- a/lib/simple_oauth2/mixins/nobrainer/access_token.rb +++ /dev/null @@ -1,98 +0,0 @@ -module Simple - module OAuth2 - module NoBrainer - # Includes all the required API, associations, validations and callbacks - module AccessToken - extend ActiveSupport::Concern - - included do # rubocop:disable Metrics/BlockLength - include ::NoBrainer::Document - include ::NoBrainer::Document::Timestamps - - before_save { self.updated_at = Time.now } - before_validation :setup_expiration, if: :new_record? - - belongs_to :client, class_name: Simple::OAuth2.config.client_class_name, - foreign_key: :client_id, primary_key: :id - belongs_to :resource_owner, class_name: Simple::OAuth2.config.resource_owner_class_name, - foreign_key: :resource_owner_id, primary_key: :id - - field :resource_owner_id, type: String, index: true, required: true - field :client_id, type: String, index: true, required: true - field :token, - type: String, - index: true, - required: true, - uniq: true, - default: -> { Simple::OAuth2.config.token_generator.generate } - field :refresh_token, - type: String, - index: true, - uniq: true, - default: -> do - if Simple::OAuth2.config.issue_refresh_token - Simple::OAuth2.config.token_generator.generate - else - '' - end - end - - field :scopes, type: String - - field :revoked_at, type: Time - field :expires_at, type: Time, required: true - field :created_at, type: Time, required: true, default: -> { Time.now } - field :updated_at, type: Time, required: true, default: -> { Time.now } - - class << self - def create_for(client, resource_owner, scopes = nil) - create( - client_id: client.id, - resource_owner_id: resource_owner.id, - scopes: scopes - ) - end - - def authenticate(token, token_type_hint = nil) - return if token.blank? - - if token_type_hint == 'refresh_token' - where(refresh_token: token).first - else - where(token: token).first - end - end - end - - def expired? - expires_at && Time.now.utc > expires_at - end - - def revoked? - revoked_at && revoked_at <= Time.now.utc - end - - def revoke!(revoked_at = Time.now.utc) - update!(revoked_at: revoked_at) - end - - def to_bearer_token - { - access_token: token, - expires_in: expires_at && Simple::OAuth2.config.access_token_lifetime.to_i, - refresh_token: refresh_token, - scope: scopes - } - end - - private - - def setup_expiration - expires_in = Simple::OAuth2.config.access_token_lifetime.to_i - self.expires_at = Time.now.utc + expires_in if expires_at.nil? && !expires_in.nil? - end - end - end - end - end -end diff --git a/lib/simple_oauth2/mixins/nobrainer/client.rb b/lib/simple_oauth2/mixins/nobrainer/client.rb deleted file mode 100644 index 66a6086..0000000 --- a/lib/simple_oauth2/mixins/nobrainer/client.rb +++ /dev/null @@ -1,43 +0,0 @@ -module Simple - module OAuth2 - module NoBrainer - # Includes all the required API, associations, validations and callbacks - module Client - extend ActiveSupport::Concern - - included do - include ::NoBrainer::Document - include ::NoBrainer::Document::Timestamps - - before_save { self.updated_at = Time.now } - - has_many :access_tokens, class_name: Simple::OAuth2.config.access_token_class_name, foreign_key: :client_id - has_many :access_grants, class_name: Simple::OAuth2.config.access_grant_class_name, foreign_key: :client_id - - field :name, type: String, required: true - field :redirect_uri, type: String, required: true - - field :key, - type: String, - required: true, - index: true, - uniq: true, - default: -> { Simple::OAuth2.config.token_generator.generate } - field :secret, - type: String, - required: true, - index: true, - uniq: true, - default: -> { Simple::OAuth2.config.token_generator.generate } - - field :created_at, type: Time, required: true, default: -> { Time.now } - field :updated_at, type: Time, required: true, default: -> { Time.now } - - def self.authenticate(key) - where(key: key.to_s).first - end - end - end - end - end -end diff --git a/lib/simple_oauth2/strategies/base.rb b/lib/simple_oauth2/strategies/base.rb index 71b18bd..a0f1e46 100644 --- a/lib/simple_oauth2/strategies/base.rb +++ b/lib/simple_oauth2/strategies/base.rb @@ -8,7 +8,7 @@ class Base class << self # Authenticates Client from the request def authenticate_client(request) - config.client_class.authenticate(request.client_id) + config.client_class.by_key(request.client_id) end # Authenticates Resource Owner from the request @@ -22,7 +22,7 @@ def authenticate_resource_owner(client, request) # Authenticates Access Grant from the request def authenticate_access_grant(request) - config.access_grant_class.authenticate(request.code) + config.access_grant_class.by_token(request.code) end # Exposes token object to Bearer token. diff --git a/lib/simple_oauth2/strategies/refresh_token.rb b/lib/simple_oauth2/strategies/refresh_token.rb index feba36d..ed3752b 100644 --- a/lib/simple_oauth2/strategies/refresh_token.rb +++ b/lib/simple_oauth2/strategies/refresh_token.rb @@ -22,7 +22,7 @@ def process(request) # Check refresh token and client id for exact matching verifier def verify_refresh_token!(request, client_id) - refresh_token = config.access_token_class.authenticate(request.refresh_token, 'refresh_token') + refresh_token = config.access_token_class.by_refresh_token(request.refresh_token) refresh_token || request.invalid_grant! refresh_token.client_id == client_id || request.unauthorized_client! diff --git a/spec/configuration/config_spec.rb b/spec/configuration/config_spec.rb index f2cdb8a..556ece5 100644 --- a/spec/configuration/config_spec.rb +++ b/spec/configuration/config_spec.rb @@ -4,7 +4,7 @@ let(:config) { described_class.new } class CustomClient - def self.authenticate(_key, _secret = nil) + def self.by_key(_key) 'Test' end end @@ -12,7 +12,11 @@ def self.authenticate(_key, _secret = nil) class CustomAccessToken def self.create_for(_client, _resource_owner, _scopes = nil); end - def self.authenticate(_token, _type = nil) + def self.by_token(_token) + 'Test' + end + + def self.by_refresh_token(_refresh_token) 'Test' end @@ -105,11 +109,11 @@ def self.generate(options = {}) end context 'works with custom Access Token class' do - it { expect(config.access_token_class.authenticate('')).to eq('Test') } + it { expect(config.access_token_class.by_token('')).to eq('Test') } end context 'works with custom Client class' do - it { expect(config.client_class.authenticate('')).to eq('Test') } + it { expect(config.client_class.by_key('')).to eq('Test') } end context 'works with custom Resource Owner class' do diff --git a/spec/dummy/orm/nobrainer/app/models/access_grant.rb b/spec/dummy/orm/nobrainer/app/models/access_grant.rb index 1e38ea2..a00875d 100644 --- a/spec/dummy/orm/nobrainer/app/models/access_grant.rb +++ b/spec/dummy/orm/nobrainer/app/models/access_grant.rb @@ -1,3 +1,3 @@ class AccessGrant - include Simple::OAuth2::NoBrainer::AccessGrant + include NoBrainer::Simple::OAuth2::AccessGrant end diff --git a/spec/dummy/orm/nobrainer/app/models/access_token.rb b/spec/dummy/orm/nobrainer/app/models/access_token.rb index 8ffe9a1..9ad0112 100644 --- a/spec/dummy/orm/nobrainer/app/models/access_token.rb +++ b/spec/dummy/orm/nobrainer/app/models/access_token.rb @@ -1,3 +1,3 @@ class AccessToken - include Simple::OAuth2::NoBrainer::AccessToken + include NoBrainer::Simple::OAuth2::AccessToken end diff --git a/spec/dummy/orm/nobrainer/app/models/client.rb b/spec/dummy/orm/nobrainer/app/models/client.rb index 049a9e6..2ffffbd 100644 --- a/spec/dummy/orm/nobrainer/app/models/client.rb +++ b/spec/dummy/orm/nobrainer/app/models/client.rb @@ -1,3 +1,3 @@ class Client - include Simple::OAuth2::NoBrainer::Client + include NoBrainer::Simple::OAuth2::Client end diff --git a/spec/dummy/orm/nobrainer/app/models/user.rb b/spec/dummy/orm/nobrainer/app/models/user.rb index 627dd7b..af2aea2 100644 --- a/spec/dummy/orm/nobrainer/app/models/user.rb +++ b/spec/dummy/orm/nobrainer/app/models/user.rb @@ -1,11 +1,3 @@ class User - include NoBrainer::Document - - field :username, type: String, index: true - field :encrypted_password, type: String - - def self.oauth_authenticate(_client, username, password) - user = where(username: username.to_s).first - user if user && user.encrypted_password == password - end + include NoBrainer::Simple::OAuth2::ResourceOwner end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4c97f34..ba27977 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -22,6 +22,7 @@ require 'rack/test' require 'ffaker' +require 'nobrainer_simple_oauth2' require ORM_GEMS_MAPPING[ENV['ORM']] require File.expand_path("../dummy/orm/#{ENV['ORM']}/app/twitter", __FILE__)