devise_token_auth 0.1.28.beta6 → 0.1.28.beta7
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.
- checksums.yaml +4 -4
- data/README.md +75 -20
- data/app/controllers/devise_token_auth/application_controller.rb +12 -0
- data/app/controllers/devise_token_auth/auth_controller.rb +1 -2
- data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +26 -10
- data/app/controllers/devise_token_auth/confirmations_controller.rb +1 -3
- data/app/controllers/devise_token_auth/passwords_controller.rb +11 -15
- data/app/controllers/devise_token_auth/registrations_controller.rb +16 -14
- data/app/controllers/devise_token_auth/sessions_controller.rb +2 -6
- data/app/models/devise_token_auth/concerns/user.rb +49 -1
- data/app/views/devise/mailer/confirmation_instructions.html.erb +1 -1
- data/app/views/devise/mailer/reset_password_instructions.html.erb +1 -1
- data/config/initializers/devise.rb +9 -0
- data/lib/devise_token_auth.rb +2 -0
- data/lib/devise_token_auth/controllers/helpers.rb +129 -0
- data/lib/devise_token_auth/controllers/url_helpers.rb +8 -0
- data/lib/devise_token_auth/engine.rb +4 -0
- data/lib/devise_token_auth/version.rb +1 -1
- data/test/controllers/demo_group_controller_test.rb +126 -0
- data/test/controllers/{demo_controller_test.rb → demo_mang_controller_test.rb} +32 -59
- data/test/controllers/demo_user_controller_test.rb +262 -0
- data/test/controllers/devise_token_auth/auth_controller_test.rb +1 -1
- data/test/controllers/devise_token_auth/confirmations_controller_test.rb +19 -6
- data/test/controllers/devise_token_auth/passwords_controller_test.rb +35 -7
- data/test/controllers/devise_token_auth/registrations_controller_test.rb +61 -8
- data/test/dummy/app/controllers/demo_group_controller.rb +13 -0
- data/test/dummy/app/controllers/demo_mang_controller.rb +12 -0
- data/test/dummy/app/controllers/demo_user_controller.rb +12 -0
- data/test/dummy/config/routes.rb +6 -5
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20140916224624_add_favorite_color_to_mangs.rb +5 -0
- data/test/dummy/db/schema.rb +2 -3
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +3977 -0
- data/test/dummy/log/test.log +165539 -0
- data/test/dummy/tmp/generators/app/controllers/application_controller.rb +8 -0
- data/test/dummy/tmp/generators/app/models/user.rb +0 -4
- data/test/dummy/tmp/generators/db/migrate/{20140916215707_devise_token_auth_create_users.rb → 20140922164332_devise_token_auth_create_users.rb} +0 -0
- data/test/lib/generators/devise_token_auth/install_generator_test.rb +2 -2
- data/test/models/user_test.rb +0 -12
- data/test/test_helper.rb +9 -9
- metadata +22 -8
- data/test/dummy/app/controllers/demo_controller.rb +0 -16
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 10be5a0682b4707bdc008fb2962bee2e00b79ad9
         | 
| 4 | 
            +
              data.tar.gz: 72f1c4e5ef9007b9a547cc8473ffe1f6bf0b227d
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: ca0fcd9e0b3ce18849b28aae0536ca97ba5652f0ba5612e0cb28ab2fba4cc208b7a01db1c2d581898af0e395453349da6732b98523237465d980a38208514784
         | 
| 7 | 
            +
              data.tar.gz: 0f2fe4f15ae311eb5d31aeb89805650f3f2114d045a085b8f1ee69040f20f4436f90eb72cb0d326ab42f5dc0e489f86c3d00a7a2caf8a465e4cc26b1c96af18e
         | 
    
        data/README.md
    CHANGED
    
    | @@ -288,48 +288,67 @@ The authentication routes must be mounted to your project. This gem includes a r | |
| 288 288 | 
             
            mount_devise_token_auth_for 'User', at: '/auth'
         | 
| 289 289 | 
             
            ~~~
         | 
| 290 290 |  | 
| 291 | 
            -
            Any model class can be used, but the class will need to include [`DeviseTokenAuth::Concerns:: | 
| 291 | 
            +
            Any model class can be used, but the class will need to include [`DeviseTokenAuth::Concerns::User`](#model-concerns) for authentication to work properly.
         | 
| 292 292 |  | 
| 293 293 | 
             
            You can mount this engine to any route that you like. `/auth` is used by default to conform with the defaults of the [ng-token-auth](https://github.com/lynndylanhurley/ng-token-auth) module.
         | 
| 294 294 |  | 
| 295 295 |  | 
| 296 | 
            -
            ## Controller  | 
| 296 | 
            +
            ## Controller Methods
         | 
| 297 297 |  | 
| 298 | 
            -
             | 
| 298 | 
            +
            ### Concerns
         | 
| 299 299 |  | 
| 300 | 
            -
            This gem includes a [Rails concern](http://api.rubyonrails.org/classes/ActiveSupport/Concern.html) called `DeviseTokenAuth::Concerns::SetUserByToken`.  | 
| 301 | 
            -
             | 
| 302 | 
            -
            This concern runs a [before_action](http://guides.rubyonrails.org/action_controller_overview.html#filters), setting the `@user` variable for use in your controllers. The user will be signed in via devise for the duration of the request.
         | 
| 300 | 
            +
            This gem includes a [Rails concern](http://api.rubyonrails.org/classes/ActiveSupport/Concern.html) called `DeviseTokenAuth::Concerns::SetUserByToken`. Include this concern to provide access to [controller methods](#controller-methods) such as [`authenticate_user!`](#authenticate-user), [`user_signed_in?`](#user-signed-in), etc.
         | 
| 303 301 |  | 
| 304 302 | 
             
            The concern also runs an [after_action](http://guides.rubyonrails.org/action_controller_overview.html#filters) that changes the auth token after each request.
         | 
| 305 303 |  | 
| 306 304 | 
             
            It is recommended to include the concern in your base `ApplicationController` so that all children of that controller include the concern as well.
         | 
| 307 305 |  | 
| 306 | 
            +
            ##### Concern example:
         | 
| 307 | 
            +
             | 
| 308 308 | 
             
            ~~~ruby
         | 
| 309 309 | 
             
            # app/controllers/application_controller.rb
         | 
| 310 310 | 
             
            class ApplicationController < ActionController::Base
         | 
| 311 311 | 
             
              include DeviseTokenAuth::Concerns::SetUserByToken
         | 
| 312 312 | 
             
            end
         | 
| 313 | 
            +
            ~~~
         | 
| 314 | 
            +
             | 
| 315 | 
            +
            ### Methods
         | 
| 316 | 
            +
             | 
| 317 | 
            +
            This gem provides access to all of the following [devise helpers](https://github.com/plataformatec/devise#controller-filters-and-helpers):
         | 
| 318 | 
            +
             | 
| 319 | 
            +
            | Method | Description |
         | 
| 320 | 
            +
            |---|---|
         | 
| 321 | 
            +
            | **`before_action :authenticate_user!`** | Returns a 401 error unless a `User` is signed-in. |
         | 
| 322 | 
            +
            | **`current_user`** | Returns the currently signed-in `User`, or `nil` if unavailable. |
         | 
| 323 | 
            +
            | **`user_signed_in?`** | Returns `true` if a `User` is signed in, otherwise `false`. |
         | 
| 324 | 
            +
            | **`devise_token_auth_group`** | Operate on multiple user classes as a group. [Read more](#group-access) |
         | 
| 313 325 |  | 
| 326 | 
            +
            Note that if the model that you're trying to access isn't called `User`, the helper method names will change. For example, if the user model is called `Admin`, the methods would look like this:
         | 
| 327 | 
            +
             | 
| 328 | 
            +
            * `before_action :authenticate_admin!`
         | 
| 329 | 
            +
            * `admin_signed_in?`
         | 
| 330 | 
            +
            * `current_admin`
         | 
| 331 | 
            +
             | 
| 332 | 
            +
             | 
| 333 | 
            +
            ##### Example: limit access to authenticated users
         | 
| 334 | 
            +
            ~~~ruby
         | 
| 314 335 | 
             
            # app/controllers/test_controller.rb
         | 
| 315 336 | 
             
            class TestController < ApplicationController
         | 
| 337 | 
            +
              before_action :authenticate_user!
         | 
| 338 | 
            +
              
         | 
| 316 339 | 
             
              def members_only
         | 
| 317 | 
            -
                 | 
| 318 | 
            -
                   | 
| 319 | 
            -
                     | 
| 320 | 
            -
             | 
| 321 | 
            -
             | 
| 322 | 
            -
             | 
| 323 | 
            -
                  }, status: 200
         | 
| 324 | 
            -
                else
         | 
| 325 | 
            -
                  render json: {
         | 
| 326 | 
            -
                    errors: ["Authorized users only."]
         | 
| 327 | 
            -
                  }, status: 401
         | 
| 328 | 
            -
                end
         | 
| 340 | 
            +
                render json: {
         | 
| 341 | 
            +
                  data: {
         | 
| 342 | 
            +
                    message: "Welcome #{current_user.name}",
         | 
| 343 | 
            +
                    user: current_user
         | 
| 344 | 
            +
                  }
         | 
| 345 | 
            +
                }, status: 200
         | 
| 329 346 | 
             
              end
         | 
| 330 347 | 
             
            end
         | 
| 331 348 | 
             
            ~~~
         | 
| 332 349 |  | 
| 350 | 
            +
            ### Token Header Format
         | 
| 351 | 
            +
             | 
| 333 352 | 
             
            The authentication information should be included by the client in the headers of each request. The headers follow the [RFC 6750 Bearer Token](http://tools.ietf.org/html/rfc6750) format:
         | 
| 334 353 |  | 
| 335 354 | 
             
            ##### Authentication headers example:
         | 
| @@ -354,11 +373,11 @@ The authentication headers required for each request will be available in the re | |
| 354 373 |  | 
| 355 374 | 
             
            ## Model Concerns
         | 
| 356 375 |  | 
| 357 | 
            -
            ##### DeviseTokenAuth::Concerns:: | 
| 376 | 
            +
            ##### DeviseTokenAuth::Concerns::User
         | 
| 358 377 |  | 
| 359 378 | 
             
            Typical use of this gem will not require the use of any of the following model methods. All authentication should be handled invisibly by the [controller concerns](#controller-concerns) described above.
         | 
| 360 379 |  | 
| 361 | 
            -
            Models that include the `DeviseTokenAuth::Concerns:: | 
| 380 | 
            +
            Models that include the `DeviseTokenAuth::Concerns::User` concern will have access to the following public methods (read the above section for context on `token` and `client`):
         | 
| 362 381 |  | 
| 363 382 | 
             
            * **`valid_token?`**: check if an authentication token is valid. Accepts a `token` and `client` as arguments. Returns a boolean.
         | 
| 364 383 |  | 
| @@ -408,6 +427,8 @@ Models that include the `DeviseTokenAuth::Concerns::SetUserByToken` concern will | |
| 408 427 |  | 
| 409 428 | 
             
            ## Using multiple models
         | 
| 410 429 |  | 
| 430 | 
            +
            ### [View Live Multi-User Demo](http://ng-token-auth-demo.herokuapp.com/multi-user)
         | 
| 431 | 
            +
             | 
| 411 432 | 
             
            This gem supports the use of multiple user models. One possible use case is to authenticate visitors using a model called `User`, and to authenticate administrators with a model called `Admin`. Take the following steps to add another authentication model to your app:
         | 
| 412 433 |  | 
| 413 434 | 
             
            1. Run the install generator for the new model.
         | 
| @@ -442,6 +463,40 @@ This gem supports the use of multiple user models. One possible use case is to a | |
| 442 463 | 
             
                end
         | 
| 443 464 | 
             
              end
         | 
| 444 465 | 
             
              ~~~
         | 
| 466 | 
            +
              
         | 
| 467 | 
            +
            1. Configure any `Admin` restricted controllers. Controllers will now have access to the methods [described here](#methods):
         | 
| 468 | 
            +
              * `before_action: :authenticate_admin!`
         | 
| 469 | 
            +
              * `current_admin`
         | 
| 470 | 
            +
              * `admin_signed_in?`
         | 
| 471 | 
            +
             | 
| 472 | 
            +
             | 
| 473 | 
            +
            ### Group access
         | 
| 474 | 
            +
             | 
| 475 | 
            +
            It is also possible to control access to multiple user types at the same time using groups. The following example shows how to limit controller access to both `User` and `Admin` users.
         | 
| 476 | 
            +
             | 
| 477 | 
            +
            ##### Example: group authentication
         | 
| 478 | 
            +
             | 
| 479 | 
            +
            ~~~ruby
         | 
| 480 | 
            +
            class DemoGroupController < ApplicationController
         | 
| 481 | 
            +
              devise_token_auth_group :member, contains: [:user, :admin]
         | 
| 482 | 
            +
              before_action :authenticate_member!
         | 
| 483 | 
            +
              
         | 
| 484 | 
            +
              def members_only
         | 
| 485 | 
            +
                render json: {
         | 
| 486 | 
            +
                  data: {
         | 
| 487 | 
            +
                    message: "Welcome #{current_member.name}",
         | 
| 488 | 
            +
                    user: current_member
         | 
| 489 | 
            +
                  }
         | 
| 490 | 
            +
                }, status: 200
         | 
| 491 | 
            +
              end
         | 
| 492 | 
            +
            end
         | 
| 493 | 
            +
            ~~~
         | 
| 494 | 
            +
             | 
| 495 | 
            +
            In the above example, the following methods will be available (in addition to `current_user`, `current_admin`, etc.):
         | 
| 496 | 
            +
             | 
| 497 | 
            +
              * `before_action: :authenticate_member!`
         | 
| 498 | 
            +
              * `current_member`
         | 
| 499 | 
            +
              * `member_signed_in?`
         | 
| 445 500 |  | 
| 446 501 | 
             
            # Conceptual
         | 
| 447 502 |  | 
| @@ -1,5 +1,17 @@ | |
| 1 1 | 
             
            module DeviseTokenAuth
         | 
| 2 2 | 
             
              class ApplicationController < DeviseController
         | 
| 3 3 | 
             
                include DeviseTokenAuth::Concerns::SetUserByToken
         | 
| 4 | 
            +
                respond_to :json
         | 
| 5 | 
            +
             | 
| 6 | 
            +
             | 
| 7 | 
            +
                def resource_class(m=nil)
         | 
| 8 | 
            +
                  if m
         | 
| 9 | 
            +
                    mapping = Devise.mappings[m]
         | 
| 10 | 
            +
                  else
         | 
| 11 | 
            +
                    mapping = Devise.mappings[resource_name] || Devise.mappings.values.first
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  mapping.to
         | 
| 15 | 
            +
                end
         | 
| 4 16 | 
             
              end
         | 
| 5 17 | 
             
            end
         | 
| @@ -1,8 +1,8 @@ | |
| 1 1 | 
             
            module DeviseTokenAuth
         | 
| 2 2 | 
             
              class AuthController < DeviseTokenAuth::ApplicationController
         | 
| 3 | 
            -
                respond_to :json
         | 
| 4 3 | 
             
                skip_after_filter :update_auth_header, :only => [:omniauth_success, :omniauth_failure]
         | 
| 5 4 | 
             
                skip_before_filter :assert_is_devise_resource!, :only => [:validate_token]
         | 
| 5 | 
            +
                before_filter :set_user_by_token, :only => [:validate_token]
         | 
| 6 6 |  | 
| 7 7 | 
             
                def validate_token
         | 
| 8 8 | 
             
                  # @user will have been set by set_user_token concern
         | 
| @@ -22,7 +22,6 @@ module DeviseTokenAuth | |
| 22 22 | 
             
                end
         | 
| 23 23 |  | 
| 24 24 | 
             
                def omniauth_success
         | 
| 25 | 
            -
             | 
| 26 25 | 
             
                  # find or create user by provider and provider uid
         | 
| 27 26 | 
             
                  @user = resource_name.where({
         | 
| 28 27 | 
             
                    uid:      auth_hash['uid'],
         | 
| @@ -1,15 +1,21 @@ | |
| 1 1 | 
             
            module DeviseTokenAuth::Concerns::SetUserByToken
         | 
| 2 2 | 
             
              extend ActiveSupport::Concern
         | 
| 3 | 
            +
              include DeviseTokenAuth::Controllers::Helpers
         | 
| 3 4 |  | 
| 4 5 | 
             
              included do
         | 
| 5 | 
            -
                before_action :set_user_by_token
         | 
| 6 6 | 
             
                after_action :update_auth_header
         | 
| 7 7 | 
             
              end
         | 
| 8 8 |  | 
| 9 9 | 
             
              # user auth
         | 
| 10 | 
            -
              def set_user_by_token
         | 
| 10 | 
            +
              def set_user_by_token(mapping=nil)
         | 
| 11 | 
            +
                # determine target authentication class
         | 
| 12 | 
            +
                rc = resource_class(mapping)
         | 
| 13 | 
            +
             | 
| 11 14 | 
             
                # no default user defined
         | 
| 12 | 
            -
                return  | 
| 15 | 
            +
                return unless rc
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                # user has already been found and authenticated
         | 
| 18 | 
            +
                return @user if @user and @user.class == rc
         | 
| 13 19 |  | 
| 14 20 | 
             
                # parse header for values necessary for authentication
         | 
| 15 21 | 
             
                uid        = request.headers['uid']
         | 
| @@ -22,17 +28,19 @@ module DeviseTokenAuth::Concerns::SetUserByToken | |
| 22 28 | 
             
                @client_id ||= 'default'
         | 
| 23 29 |  | 
| 24 30 | 
             
                # mitigate timing attacks by finding by uid instead of auth token
         | 
| 25 | 
            -
                 | 
| 31 | 
            +
                user = uid && rc.find_by_uid(uid)
         | 
| 26 32 |  | 
| 27 | 
            -
                if  | 
| 28 | 
            -
                  sign_in(:user,  | 
| 33 | 
            +
                if user && user.valid_token?(@token, @client_id)
         | 
| 34 | 
            +
                  sign_in(:user, user, store: false, bypass: true)
         | 
| 29 35 |  | 
| 30 36 | 
             
                  # check this now so that the duration of the request itself doesn't eat
         | 
| 31 37 | 
             
                  # away the buffer
         | 
| 32 | 
            -
                  @is_batch_request = is_batch_request?( | 
| 38 | 
            +
                  @is_batch_request = is_batch_request?(user, @client_id)
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  return @user = user
         | 
| 33 41 | 
             
                else
         | 
| 34 42 | 
             
                  # zero all values previously set values
         | 
| 35 | 
            -
                  @user = @ | 
| 43 | 
            +
                  return @user = @is_batch_request = nil
         | 
| 36 44 | 
             
                end
         | 
| 37 45 | 
             
              end
         | 
| 38 46 |  | 
| @@ -59,13 +67,21 @@ module DeviseTokenAuth::Concerns::SetUserByToken | |
| 59 67 | 
             
                end
         | 
| 60 68 | 
             
              end
         | 
| 61 69 |  | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 70 | 
            +
             | 
| 71 | 
            +
              def resource_class(m=nil)
         | 
| 72 | 
            +
                if m
         | 
| 73 | 
            +
                  mapping = Devise.mappings[m]
         | 
| 74 | 
            +
                else
         | 
| 75 | 
            +
                  mapping = Devise.mappings[resource_name] || Devise.mappings.values.first
         | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
             | 
| 64 78 | 
             
                mapping.to
         | 
| 65 79 | 
             
              end
         | 
| 66 80 |  | 
| 81 | 
            +
             | 
| 67 82 | 
             
              private
         | 
| 68 83 |  | 
| 84 | 
            +
             | 
| 69 85 | 
             
              def is_batch_request?(user, client_id)
         | 
| 70 86 | 
             
                user.tokens[client_id] and
         | 
| 71 87 | 
             
                user.tokens[client_id]['updated_at'] and
         | 
| @@ -1,7 +1,5 @@ | |
| 1 1 | 
             
            module DeviseTokenAuth
         | 
| 2 | 
            -
              class ConfirmationsController <  | 
| 3 | 
            -
                include Devise::Controllers::Helpers
         | 
| 4 | 
            -
             | 
| 2 | 
            +
              class ConfirmationsController < DeviseTokenAuth::ApplicationController
         | 
| 5 3 | 
             
                def show
         | 
| 6 4 | 
             
                  @user = resource_class.confirm_by_token(params[:confirmation_token])
         | 
| 7 5 |  | 
| @@ -1,10 +1,6 @@ | |
| 1 1 | 
             
            module DeviseTokenAuth
         | 
| 2 | 
            -
              class PasswordsController <  | 
| 3 | 
            -
                 | 
| 4 | 
            -
                include DeviseTokenAuth::Concerns::SetUserByToken
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                skip_before_filter :require_no_authentication
         | 
| 7 | 
            -
                skip_before_filter :set_user_by_token, :only => [:create, :edit]
         | 
| 2 | 
            +
              class PasswordsController < DeviseTokenAuth::ApplicationController
         | 
| 3 | 
            +
                before_filter :set_user_by_token, :only => [:update]
         | 
| 8 4 | 
             
                skip_after_filter :update_auth_header, :only => [:create, :edit]
         | 
| 9 5 |  | 
| 10 6 | 
             
                # this action is responsible for generating password reset tokens and
         | 
| @@ -17,7 +13,7 @@ module DeviseTokenAuth | |
| 17 13 | 
             
                    }, status: 401
         | 
| 18 14 | 
             
                  end
         | 
| 19 15 |  | 
| 20 | 
            -
                  unless  | 
| 16 | 
            +
                  unless params[:redirect_url]
         | 
| 21 17 | 
             
                    return render json: {
         | 
| 22 18 | 
             
                      success: false,
         | 
| 23 19 | 
             
                      errors: ['Missing redirect url.']
         | 
| @@ -32,13 +28,11 @@ module DeviseTokenAuth | |
| 32 28 | 
             
                  errors = nil
         | 
| 33 29 |  | 
| 34 30 | 
             
                  if @user
         | 
| 35 | 
            -
                    @user. | 
| 36 | 
            -
                      reset_password_redirect_url: resource_params[:redirect_url]
         | 
| 37 | 
            -
                    })
         | 
| 38 | 
            -
             | 
| 39 | 
            -
                    @user = resource_class.send_reset_password_instructions({
         | 
| 31 | 
            +
                    @user.send_reset_password_instructions({
         | 
| 40 32 | 
             
                      email: resource_params[:email],
         | 
| 41 | 
            -
                      provider: 'email'
         | 
| 33 | 
            +
                      provider: 'email',
         | 
| 34 | 
            +
                      redirect_url: params[:redirect_url],
         | 
| 35 | 
            +
                      client_config: params[:config_name]
         | 
| 42 36 | 
             
                    })
         | 
| 43 37 |  | 
| 44 38 | 
             
                    if @user.errors.empty?
         | 
| @@ -80,11 +74,12 @@ module DeviseTokenAuth | |
| 80 74 | 
             
                      expiry: expiry
         | 
| 81 75 | 
             
                    }
         | 
| 82 76 |  | 
| 77 | 
            +
                    # ensure that user is confirmed
         | 
| 83 78 | 
             
                    @user.skip_confirmation! unless @user.confirmed_at
         | 
| 84 79 |  | 
| 85 80 | 
             
                    @user.save!
         | 
| 86 81 |  | 
| 87 | 
            -
                    redirect_to(@user.build_auth_url( | 
| 82 | 
            +
                    redirect_to(@user.build_auth_url(params[:redirect_url], {
         | 
| 88 83 | 
             
                      token:          token,
         | 
| 89 84 | 
             
                      client_id:      client_id,
         | 
| 90 85 | 
             
                      reset_password: true
         | 
| @@ -141,7 +136,8 @@ module DeviseTokenAuth | |
| 141 136 | 
             
                end
         | 
| 142 137 |  | 
| 143 138 | 
             
                def resource_params
         | 
| 144 | 
            -
                  params.permit(:email, :password, :password_confirmation, :reset_password_token | 
| 139 | 
            +
                  params.permit(:email, :password, :password_confirmation, :reset_password_token)
         | 
| 145 140 | 
             
                end
         | 
| 141 | 
            +
             | 
| 146 142 | 
             
              end
         | 
| 147 143 | 
             
            end
         | 
| @@ -1,14 +1,6 @@ | |
| 1 1 | 
             
            module DeviseTokenAuth
         | 
| 2 | 
            -
              class RegistrationsController <  | 
| 3 | 
            -
                 | 
| 4 | 
            -
                include DeviseTokenAuth::Concerns::SetUserByToken
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                #prepend_before_filter :require_no_authentication, :only => [ :create, :destroy, :update ]
         | 
| 7 | 
            -
                skip_before_filter :require_no_authentication
         | 
| 8 | 
            -
                before_action :configure_devise_token_auth_permitted_parameters
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                skip_before_filter :set_user_by_token, :only => [:create]
         | 
| 11 | 
            -
                skip_before_filter :authenticate_scope!, :only => [:destroy, :update]
         | 
| 2 | 
            +
              class RegistrationsController < DeviseTokenAuth::ApplicationController
         | 
| 3 | 
            +
                before_filter :set_user_by_token, :only => [:destroy, :update]
         | 
| 12 4 | 
             
                skip_after_filter :update_auth_header, :only => [:create, :destroy]
         | 
| 13 5 |  | 
| 14 6 | 
             
                respond_to :json
         | 
| @@ -18,8 +10,22 @@ module DeviseTokenAuth | |
| 18 10 | 
             
                  @resource.uid        = sign_up_params[:email]
         | 
| 19 11 | 
             
                  @resource.provider   = "email"
         | 
| 20 12 |  | 
| 13 | 
            +
                  # success redirect url is required
         | 
| 14 | 
            +
                  unless params[:confirm_success_url]
         | 
| 15 | 
            +
                    return render json: {
         | 
| 16 | 
            +
                      status: 'error',
         | 
| 17 | 
            +
                      data:   @resource,
         | 
| 18 | 
            +
                      errors: ["Missing `confirm_success_url` param."]
         | 
| 19 | 
            +
                    }, status: 403
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 21 22 | 
             
                  begin
         | 
| 22 23 | 
             
                    if @resource.save
         | 
| 24 | 
            +
                      @resource.send_confirmation_instructions({
         | 
| 25 | 
            +
                        client_config: params[:config_name],
         | 
| 26 | 
            +
                        redirect_url: params[:confirm_success_url]
         | 
| 27 | 
            +
                      })
         | 
| 28 | 
            +
             | 
| 23 29 | 
             
                      render json: {
         | 
| 24 30 | 
             
                        status: 'success',
         | 
| 25 31 | 
             
                        data:   @resource.as_json
         | 
| @@ -86,9 +92,5 @@ module DeviseTokenAuth | |
| 86 92 | 
             
                def account_update_params
         | 
| 87 93 | 
             
                  params.permit(devise_parameter_sanitizer.for(:account_update))
         | 
| 88 94 | 
             
                end
         | 
| 89 | 
            -
             | 
| 90 | 
            -
                def configure_devise_token_auth_permitted_parameters
         | 
| 91 | 
            -
                  devise_parameter_sanitizer.for(:sign_up) << :confirm_success_url
         | 
| 92 | 
            -
                end
         | 
| 93 95 | 
             
              end
         | 
| 94 96 | 
             
            end
         | 
| @@ -1,11 +1,7 @@ | |
| 1 1 | 
             
            # see http://www.emilsoman.com/blog/2013/05/18/building-a-tested/
         | 
| 2 2 | 
             
            module DeviseTokenAuth
         | 
| 3 | 
            -
              class SessionsController <  | 
| 4 | 
            -
                 | 
| 5 | 
            -
                skip_before_filter :verify_signed_out_user, only: :destroy
         | 
| 6 | 
            -
             | 
| 7 | 
            -
                include Devise::Controllers::Helpers
         | 
| 8 | 
            -
                include DeviseTokenAuth::Concerns::SetUserByToken
         | 
| 3 | 
            +
              class SessionsController < DeviseTokenAuth::ApplicationController
         | 
| 4 | 
            +
                before_filter :set_user_by_token, :only => [:destroy]
         | 
| 9 5 |  | 
| 10 6 | 
             
                def create
         | 
| 11 7 | 
             
                  @user = resource_class.find_by_email(resource_params[:email])
         | 
| @@ -11,7 +11,6 @@ module DeviseTokenAuth::Concerns::User | |
| 11 11 | 
             
                serialize :tokens, JSON
         | 
| 12 12 |  | 
| 13 13 | 
             
                validates_presence_of :email, if: Proc.new { |u| u.provider == 'email' }
         | 
| 14 | 
            -
                validates_presence_of :confirm_success_url, if: Proc.new {|u| u.provider == 'email'}
         | 
| 15 14 |  | 
| 16 15 | 
             
                # only validate unique emails among email registration users
         | 
| 17 16 | 
             
                validate :unique_email_user, on: :create
         | 
| @@ -20,6 +19,7 @@ module DeviseTokenAuth::Concerns::User | |
| 20 19 | 
             
                after_save :set_empty_token_hash
         | 
| 21 20 | 
             
                after_initialize :set_empty_token_hash
         | 
| 22 21 |  | 
| 22 | 
            +
             | 
| 23 23 | 
             
                # don't use default devise email validation
         | 
| 24 24 | 
             
                def email_required?
         | 
| 25 25 | 
             
                  false
         | 
| @@ -28,9 +28,50 @@ module DeviseTokenAuth::Concerns::User | |
| 28 28 | 
             
                def email_changed?
         | 
| 29 29 | 
             
                  false
         | 
| 30 30 | 
             
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
             | 
| 33 | 
            +
                # override devise method to include additional info as opts hash
         | 
| 34 | 
            +
                def send_confirmation_instructions(opts=nil)
         | 
| 35 | 
            +
                  unless @raw_confirmation_token
         | 
| 36 | 
            +
                    generate_confirmation_token!
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  opts ||= {}
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  # fall back to "default" config name
         | 
| 42 | 
            +
                  opts[:client_config] ||= "default"
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  if pending_reconfirmation?
         | 
| 45 | 
            +
                    opts[:to] = unconfirmed_email
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  send_devise_notification(:confirmation_instructions, @raw_confirmation_token, opts)
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
             | 
| 52 | 
            +
                # override devise method to include additional info as opts hash
         | 
| 53 | 
            +
                def send_reset_password_instructions(opts=nil)
         | 
| 54 | 
            +
                  token = set_reset_password_token
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                  opts ||= {}
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  # fall back to "default" config name
         | 
| 59 | 
            +
                  opts[:client_config] ||= "default"
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                  if pending_reconfirmation?
         | 
| 62 | 
            +
                    opts[:to] = unconfirmed_email
         | 
| 63 | 
            +
                  else
         | 
| 64 | 
            +
                    opts[:to] = email
         | 
| 65 | 
            +
                  end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                  send_devise_notification(:reset_password_instructions, token, opts)
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                  token
         | 
| 70 | 
            +
                end
         | 
| 31 71 | 
             
              end
         | 
| 32 72 |  | 
| 33 73 |  | 
| 74 | 
            +
             | 
| 34 75 | 
             
              def valid_token?(token, client_id='default')
         | 
| 35 76 | 
             
                client_id ||= 'default'
         | 
| 36 77 |  | 
| @@ -44,6 +85,13 @@ module DeviseTokenAuth::Concerns::User | |
| 44 85 | 
             
              end
         | 
| 45 86 |  | 
| 46 87 |  | 
| 88 | 
            +
              # this must be done from the controller so that additional params
         | 
| 89 | 
            +
              # can be passed on from the client
         | 
| 90 | 
            +
              def send_confirmation_notification?
         | 
| 91 | 
            +
                false
         | 
| 92 | 
            +
              end
         | 
| 93 | 
            +
             | 
| 94 | 
            +
             | 
| 47 95 | 
             
              def token_is_current?(token, client_id)
         | 
| 48 96 | 
             
                return true if (
         | 
| 49 97 | 
             
                  # ensure that expiry and token are set
         |