우리의 제품은 레일 응용 프로그램입니다 로그인하지; 인증은 Devise 및 OmniAuth로 처리됩니다. 총 2000 명의 사용자가 있습니다. 최근에 일부 사용자가 로그인 할 수 없다는보고가 있었지만 그 이유를 알 수 없습니다. 서버 오류나 프로덕션 로그의 어떤 것도 얻지 못해 아무것도 제안 할 필요가 없습니다.유증/OmniAuth 일부 사용자
일부 코드를 살펴 보자 ...
class OmniauthCallbacksController < Devise::OmniauthCallbacksController
...
def twitter
oauthorize "twitter"
end
private
def oauthorize(provider)
if env['omniauth.auth']
@identity = Identity.from_omniauth(env['omniauth.auth'])
@person = @identity.person
# 1. failing here? Maybe?
if @person
PersonMeta.create_for_person(@person, session[:referrer], session[:landing_page]) if @person.first_visit?
# 2. PersonMetas *aren't* being created.
flash[:notice] = I18n.t("devise.omniauth_callbacks.success", kind: provider)
sign_in_and_redirect(@person, :event => :authentication)
# 3. Definitely failing by here…
else
redirect_to root_url
end
else
redirect_to root_url
end
end
end
class Identity < ActiveRecord::Base
belongs_to :person, counter_cache: true, touch: true
after_create :check_person
def self.from_omniauth(auth)
where(auth.slice("provider", "uid")).first_or_initialize.tap do |identity|
identity.oauth_token = auth['credentials']['token']
identity.oauth_secret = auth['credentials']['secret']
case auth['provider']
when "twitter"
identity.name = auth['info']['name']
identity.nickname = auth['info']['nickname']
identity.bio = auth['info']['description']
identity.avatar_address = auth['info']['image']
else
raise "Provider #{provider} not handled"
end
identity.save
end
end
def check_person
if person_id.nil?
p = create_person(nickname: nickname, name: name, remote_avatar_url: biggest_avatar)
p.identities << self
end
end
def biggest_avatar
avatar_address.gsub('_bigger', '').gsub('_normal', '') if avatar_address
end
end
class PersonMeta < ActiveRecord::Base
attr_accessible :landing_page, :mixpanel_id, :referrer_url, :person_id
belongs_to :person
def self.create_for_person(person, referrer, landing_page)
PersonMeta.create!(referrer_url: referrer, landing_page: landing_page, person_id: person.id)
end
end
그래서 우리는, 그리고 우리는 생산에 오류를받지 못하고 있습니다.
우리는 어디에서 시작합니까? 오류 지점이 Identity인지 확인해 보겠습니다.
이 방법은 기존 ID (더 많은 공급자를 위해 추가 코드를 작성했지만 아직 클라이언트 측을 구현하지 않았습니다)를 검색합니다. ID가 발견되지 않으면 ID를 작성한 다음 연관된 Person 모델을 작성합니다. 이것이 실패 지점 인 경우 우리는 생산 콘솔에서 의심스럽게 빈 칸을 볼 수 있습니다. 그러나 아니오 - 사람 & 정체성 모델은 모든 올바른 모든 필드 생성되지 않았습니다, 앱 관련 비트 (예를 들어 자신의 '사용자 프로필 페이지는'모두가 생성 된)을 보았다.
방금 에 #oauthorize를 추가했습니다. @identity.person
이 nil
인 500 개가 있었지만 복제 할 수 없었습니다.
어쨌든 의 실제 사용자는의 연관 모델을 그대로 유지합니다. 방법을 아래로 이동하여 PersonMeta
레코드를 만들어 방문 페이지와 같은 간단한 정보를 기록합니다. 나는 이것을 Person
에 after_create
으로했을 것입니다.하지만 세션 데이터를 모델에 전달하는 것이 옳지 않다고 생각했습니다.
이
는 우리의 문제가 사용자 생성되지 않습니다. 이 시점에서, 나는 다소 혼란 스럽다. 어떻게 만들지 모르겠다 ! (강타와 함께) 거기에있어,하지만 뭔가가 고장 났을 때 예외를 던져서는 안되나요? 그렇지 않습니다.어쨌든 사람의 첫 번째 방문 인 경우에만 호출되며 이후의 로그인은 무시됩니다. 문제가있는 사용자 중 하나는 내가 등 다른 브라우저를 시도, 다시 로그인을 포함하여 다양한 것들을 시도해 그를지고있어 그래서 친구이며, 쓰기 45 분 보낸 이후, 어쨌든
일어나고 유지 이 게시물 ... 사용자의
하나는 트위터를 통해 응용 프로그램에 대한 액세스 권한을 취소하고 재 인증. 모든 것이 지금 작동합니다.
대체 무엇입니까?
그의 이전 신원은 입니다. 그의 OAuth 토큰 등이 올바르게 저장되어 있습니다.
다행히도 이것은 한 사용자에 대해 해결되었지만 분명히 진행중인 문제입니다.
우리는 무엇을해야합니까?
나는 그렇게 생각하지 않는다. 각 사용자에게 영향을 미쳤다. 유효하고 완전한 Identity & Person 필드 =/ –
'PersonMeta'와'nil'' person_id 데이터베이스에? – nickgrim
아니요 - 제대로 생성되었거나 존재하지 않습니다. –