Постоянный пользователь между веб-приложением и приложением IOS

У меня есть приложение для рабочего стола, и я использую оболочку turbolinks для IOS и ANDROID. У меня нет проблем с ANDROID. Но в IOS, если пользователь выходит из настольного приложения, пользователь должен снова войти в систему, когда он / она переходит к моему значку приложения iphone (см. полные шаги ниже).

Мои вопросы: - Что вызывает это? (странно, не проблема с ANDROID) - что/где мне нужно исправить. - это проблема со стороны рельсов, проблема с туроблинками или - ниже код со стороны рельсов. NB: у меня нет кода приложения IOS (использую мобильный программатор, чтобы помочь мне)

У меня есть приложение, которое использует: 1- гем Ruby on Rails "rails", "5.2.2" 2- GEM - гем Devise "devise", ">= 4.2.0" гем "devise-async" 3- оболочка Turbolinks для родной Android/IOS - 4- Postgres

Вот сценарий:

  • Пользователь вошел в систему на рабочем столе (IE/EDGE)
  • Пользователь входит в приложение IOS и использует его. свайпы закрываются. кликает по иконке. входит обратно в порядке.
  • Пользователь закрыл приложение
  • Пользователь выходит из настольного приложения
  • Пользователь нажимает ЗНАЧОК ПРИЛОЖЕНИЯ на IOS — требуется повторный вход в систему. (Это не проблема для Android

Пользовательская модель

before_save :ensure_authentication_token_is_present

265

    before_save :set_name
  266  
  ...
 1413    end
 1414  
 1415:   def ensure_authentication_token_is_present
 1416:     if authentication_token.blank?
 1417:       self.authentication_token = generate_authentication_token
 1418      end
 1419    end
 1420  
 1421:   def generate_authentication_token
 1422      loop do
 1423        token = Devise.friendly_token
 1424:       break token unless User.find_by(authentication_token: token)
 1425      end
 1426    end

КОНТРОЛЕР СЕАНСОВ:

class Api::V1::SessionsController < Api::V1::BaseController



skip_before_action :authenticate_user!
  skip_before_action :authenticate_user_using_x_auth_token

  skip_before_action :verify_authenticity_token,   only: :destroy
  before_action      :authenticate_user_by_token!, only: :destroy

  def create

        user = User.find_for_database_authentication(email: params[:user] && 

params[:user][:

email])
        if invalid_password?(user)
          respond_with_error("Incorrect email or password", 401)
        else
          render(
            json: { auth_token: user.authentication_token },
            location: root_path,
            status: :created
          )
        end
      end

  def destroy
    Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)

    head :ok
  end

  private

  def invalid_password?(user)
    user.blank? || !user.valid_password?(params[:user][:password])
  end

end

методы аутентификации

def authenticate_user_using_x_auth_token
user_email = params[:id].presence
auth_token = request.headers["X-Auth-Token"].presence

user = user_email && User.find_by(email: user_email)

if user && Devise.secure_compare(user.authentication_token, auth_token)
  sign_in user, store: false
else
  respond_with_error(
    "Could not authenticate with the provided credentials",
    401
  )
end

конец

def authenticate_user_by_token!
    auth_token = request.headers["X-Auth-Token"].presence
    user       = User.find_by(authentication_token: auth_token)

    if user.present?
      sign_in user, store: false
    else
      respond_with_error("Could not authenticate with the provided credentials", 401)
    end
  end

person user2970050    schedule 06.03.2019    source источник
comment
поэтому я увидел этот пост: stackoverflow.com/questions/14924606/ Это находится в DEVISE... и мы не используем. # ==› Конфигурация для :token_authenticable # Определяет имя параметра params токена аутентификации # config.token_authentication_key = :auth_token Thoughts?   -  person user2970050    schedule 06.03.2019


Ответы (1)


Файлы cookie сеанса очищаются в приложении Turbolinks-iOS каждый раз, когда приложение закрывается. Вероятно, вы используете постоянный файл cookie, и при выходе из системы, если устройство очищает user.remember_created_at, файл cookie становится недействительным.

Попробуйте добавить это в конфигурацию устройства:

config.expire_all_remember_me_on_sign_out = false

Источник: https://github.com/plataformatec/devise/blob/11026007206226c1189f6050ab05d2284f47a669/lib/devise.rb#L130-L132

person Patrick O'Grady    schedule 06.03.2019