2015-09-28 3 views
4

Я пытаюсь разработать приложение Rails, которое будет в основном взаимодействовать с пользователями Android-приложений. Люди должны иметь возможность зарегистрироваться и войти в приложение (они могут выполнять только большинство запросов при входе в систему).Rails аутентификация пользователей из собственного приложения для Android

Я просмотрел множество руководств о том, как сделать эквивалент «сохранение сеанса» на приложении, но все они рекомендует использовать gem 'devise' и ее :token_authenticable, который был устаревшего в течение некоторого времени.

Мне нужен серьезный совет о том, как выполнить что-то эквивалентное. По моему мнению, клиент отправляет запрос с параметрами, такими как {email: "[email protected]", password: "pw12345"}, я проверяю, что они соответствуют существующему пользователю и извлекают токен, который этот клиент будет теперь отправлять в каждом запросе через заголовки (например, {"my_app_user_email": "[email protected]", "my_app_user_token":"abcdef123456"}).

Я уже установить некоторые методы с фальшивыми ценностями, такими как

def login 
    if valid_user?(params[:email], params[:password]) 
    render json: {user_token: default_user_token} 
    else 
    render json: {message: 'Couldn\'t login'}, status: 401 
    end 
end 

Где default_user_token является фиксированной строкой, и valid_user? сравнивает с фиксированными значениями, а также.

Я полагаю, что моя проблема заключается в том, что это правильный подход, и если да, то как я могу создать модель User, которая создает и проверяет токены?

Extra бит кода

def verify_token # This already works by using default values in the Android app code 
    email = request.headers['HTTP_MY_APP_USER_EMAIL'] 
    token = request.headers['HTTP_MY_APP_USER_TOKEN'] 
    user = User.find_by_email(email) 
    user && user.valid_token?(token) # returns true for default_user_token, for now 
end 
+0

вы можете попробовать https://github.com/doorkeeper-gem/doorkeeper – IS04

+0

также взгляните на jwt http://jwt.io/ – dimakura

ответ

1

Я думаю, что ваш подход является правильным. Вы можете добавить auth_token поля для вашей модели и создать новую, как пользователь входит в вы можете сгенерировать маркер так:.

def generate_authentication_token! 
    begin 
     self.auth_token = Devise.friendly_token 
    end while self.class.exists?(auth_token: auth_token) 
end 

, чем вы можете создать службу аутентификации, которая требует маркера пользователя к каждому запрос так:

module Authenticable 

    #Devise overwritten method 
    def current_user 
    @current_user ||= User.find_by(auth_token: request.headers['Authorization']) 
    end 

    def authenticate_with_token! 
    render json: { errors: "Not authenticated" }, status: :unauthorized unless user_signed_in? 
    end 

    def user_signed_in? 
    current_user.present? 
    end 

end 

, а затем, вы можете создать SessionsController, что войти в/выход пользователя с помощью изобрести:

def create 
    user_password = params[:session][:password] 
    user_email = params[:session][:email] 
    user = user_email.present? && User.find_by(email: user_email) 

    if user 
     if user.valid_password? user_password 
     sign_in user, store: false 
     user.generate_authentication_token! 
     user.save 
     render json: user, root: :user, status: 200, location: [:api, user] 
     else 
     render json: { errors: "Invalid email or password" }, status: 422 
     end 
    else 
     render json: { errors: "Invalid email or password" }, status: 422 
    end 
    end 

def destroy 
    user = User.find_by(auth_token: params[:id]) 
    user.generate_authentication_token! 
    user.save 
    head 204 
end 

у меня есть этот репозиторий на GitHub т шляпа использует это решение: https://github.com/brunojppb/api_on_rails

+1

Спасибо большое, Бруно! Это близко к тому, что я закончил кодированием. Кроме того, я не использую Devise, поэтому мне пришлось создать отдельный класс модели Token и другие небольшие дополнения. Кроме того, я проверяю электронную почту пользователя (из заголовков запроса), прежде чем проверять, является ли он действительным токеном, чтобы избежать проблемы, я считаю, это то, что заставило их отказаться от ': token_authenticable' – Berbare

+0

Рад помочь моему другу :) –

Смежные вопросы