-
-
Save gonzalo-bulnes/9001010 to your computer and use it in GitHub Desktop.
| # app/controllers/sessions_controller.rb | |
| class SessionsController < Devise::SessionsController | |
| # This controller provides a JSON version of the Devise::SessionsController and | |
| # is compatible with the use of SimpleTokenAuthentication. | |
| # See https://github.com/gonzalo-bulnes/simple_token_authentication/issues/27 | |
| def create | |
| # Fetch params | |
| email = params[:session][:email] if params[:session] | |
| password = params[:session][:password] if params[:session] | |
| id = User.find_by(email: email).try(:id) if email.presence | |
| # Validations | |
| if request.format != :json | |
| render status: 406, json: { message: 'The request must be JSON.' } | |
| return | |
| end | |
| if email.nil? or password.nil? | |
| render status: 400, json: { message: 'The request MUST contain the user email and password.' } | |
| return | |
| end | |
| # Authentication | |
| user = User.find_by(email: email) | |
| if user | |
| if user.valid_password? password | |
| user.reset_authentication_token! | |
| # Note that the data which should be returned depends heavily of the API client needs. | |
| render status: 200, json: { email: user.email, authentication_token: user.authentication_token, id: id } | |
| else | |
| render status: 401, json: { message: 'Invalid email or password.' } | |
| end | |
| else | |
| render status: 401, json: { message: 'Invalid email or password.' } | |
| end | |
| end | |
| def destroy | |
| # Fetch params | |
| user = User.find_by(authentication_token: params[:user_token]) | |
| if user.nil? | |
| render status: 404, json: { message: 'Invalid token.' } | |
| else | |
| user.authentication_token = nil | |
| user.save! | |
| render status: 204, json: nil | |
| end | |
| end | |
| end |
Hi @dnlserrano, I believe you're right about both of your observations, this sessions controller needs a serious review.
I took a look to your gist; it looks better than mine. I'm aware of the Simple Token Authentication issue you opened (#48) about intenting to destroy the session with wrong credentials; once fixed, I think we could update your SessionsController and use it as a reference. Sadly I'm a bit short of time these days, but I'll be reading your updates.
Update: @dnlserrano shared his RegistrationsController and SessionsController in that gist (original comment).
Hi Gonzalo (@gonzalo-bulnes),
If we are doing all the ground work, there is nothing in Devise SessionController that is required, should this class still extend Devise SessionController.
@gonzalo-bulnes , btw thanks for SimpleToken
why is this code in the gist needed... can't you just check the current_user
PS I tried to check current user but it always return a user (whether i singed in with valid or invalid token) ?
I just write an article about how to add JSON API login based on Devise and simple token authentication. But I don't know how to test sign_out api with python code now. @gonzalo-bulnes
Hi again @gonzalo-bulnes.
After looking at this comment of yours a little more carefully, I think I got it. I now have basic custom SessionsController performing login (creation of auth_token) and logout (authenticating the user and destroying the auth_token in case authentatication was successful). Here is the new gist for it.
Would love to hear from you in regards to my previous questions anyway.
Regards!