У меня есть приложение для рабочего стола и я использую упаковщик turbolinks для IOS и Android.У меня нет никаких проблем на Android.Но в IOS, если пользователь выходит из настольного приложения, пользователь должен войти в систему, когда он / она переходит к значку приложения iphone (см. Полные шаги ниже).
Мои вопросы: - что вызывает это?(странно не проблема с ANDROID) - что / где мне нужно это исправить.- это проблема со стороны рельсов, проблема с турбо-ссылками или - ниже приведен код со стороны Rails.NB: у меня нет кода приложения IOS - (использую мобильный программист, чтобы помочь мне)
У меня есть приложение, которое использует - 1- Ruby on Rails gem "rails", "5.2.2" 2- GEM - Devise gem "devise", "> = 4.2.0" gem "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
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