Rails API: лучший способ реализовать аутентификацию?
Я пишу приложение Rails 4, которое будет предоставлять API для мобильного приложения, которое еще не разработано. Пользователи будут проходить проверку подлинности с помощью электронной почты и пароль из мобильного приложения.
в то время как я нашел довольно много информации по этой теме. Трудно понять, что является устаревшим или неоптимальным. Я читал о HTTP Basic Auth, который не кажется слишком безопасным, и HTTP Token-based Auth, но я не уверен, как связать это с обычной проверкой подлинности электронной почты и пароля (я использую Придумайте кстати).
Я просто хотел бы знать, какова текущая лучшая практика по реализации этого, поэтому я буду уверен, что иду правильным путем.
4 ответов:
важным моментом с точки зрения безопасности является обмен электронной почтой и паролем пользователя для токена один раз, а затем использовать этот токен для последующих запросов. Это потому, что:
- вы не хотите, чтобы клиентское приложение отвечало за сохранение пароля пользователя, где ошибка или атака может привести к его утечке; и
- выпущенный сервером токен дает вам (и вашим пользователям) возможность истекать токен, если это необходимо, например, для блокировки украденного устройства или заблокируйте неверный клиент API.
есть много способов сделать это с разной степенью сложности.
вот учебник, который является очень недавним и имеет тщательное пошаговое руководство для создания API в Rails с проверкой подлинности на основе токенов (не используя Devise, но все же важно понимать концепции):https://labs.kollegorna.se/blog/2015/04/build-an-api-now/
другой вариант-включить модуль ниже в вашу модель devise и добавить auth_token в таблицу.
приложение/модели/проблемы / token_authenticable.РБ
module TokenAuthenticatable extend ActiveSupport::Concern included do before_save :ensure_auth_token end module ClassMethods def find_by_token(token) find_by(auth_token: token) end end def ensure_auth_token self.auth_token = generate_auth_token if auth_token.blank? end private def generate_auth_token loop do token = Devise.friendly_token break token unless self.class.exists?(auth_token: token) end end endapp / controllers / api/v1 / login_controller.РБ
... def login_user(params) if params[:authentication] @user = User.find_by(auth_token: params[:authentication]) if @user.nil? render json: err('login user by token failed', ERR_USER_NOT_FOUND), status: :not_found event('login_user_by_auth_failed', 'token', params[:authentication]) return else render status: :ok, json: @user return end else user = user.find_by(email: params[:email]) if user.nil? event('login_user_failed_not_found', 'user_email', params[:email]) render json: err("login user not found #{params[:email]}", ERR_USER_NOT_FOUND), status: :not_found return end if user.access_locked? event('login_user_blocked', 'user_id', user.id) render json: err("login user account is locked : #{user.id}", ERR_USER_LOCKED), status: :unauthorized return end unless user.try(:valid_password?, params[:password]) event("login_user_password_does_not_match #{user.id}", 'user_id', user.id) render json: err('login user password does not match', ERR_PASSWORD_NOT_MATCH), status: :unauthorized return end event('login_user_succeeded', 'user_id', user.id) @user= user if @user.save response.headers['authentication'] = @user.auth_token render status: :ok, json: @user return else render json: @user.errors, status: :unprocessable_entity return end end end ...Edit: исправлена опечатка для взлома кода
@Roma149 это скорее личное предпочтение, но большинство людей, которые только начинают использовать Devise, так как это самый простой IMO. OAuth2 также является хорошим вариантом. В качестве более важной заметки вы всегда можете перейти к Ruby Toolbox
есть много хорошей информации о драгоценных камнях там, и они даже говорят вам возраст и популярность драгоценного камня. Это также позволит вам различать, какие драгоценные камни сообщество действительно вылезает сейчас или что ушло несвежий.
помните, что в Ruby и Ruby On Rails это не всегда то, что лучше всего подходит для вашего проекта!
Трали камень предлагает разработать стратегию для проверки подлинности на основе маркеров в API-только Рубин на Rails приложений. Его главной особенностью является поддержка нескольких токенов на пользователя.
Comments