2013-06-30 2 views
0

우리의 제품은 레일 응용 프로그램입니다 로그인하지; 인증은 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.personnil 인 500 개가 있었지만 복제 할 수 없었습니다.

어쨌든 의 실제 사용자는의 연관 모델을 그대로 유지합니다. 방법을 아래로 이동하여 PersonMeta 레코드를 만들어 방문 페이지와 같은 간단한 정보를 기록합니다. 나는 이것을 Personafter_create으로했을 것입니다.하지만 세션 데이터를 모델에 전달하는 것이 옳지 않다고 생각했습니다.

는 우리의 문제가 사용자 생성되지 않습니다. 이 시점에서, 나는 다소 혼란 스럽다. 어떻게 만들지 모르겠다 ! (강타와 함께) 거기에있어,하지만 뭔가가 고장 났을 때 예외를 던져서는 안되나요? 그렇지 않습니다.

어쨌든 사람의 첫 번째 방문 인 경우에만 호출되며 이후의 로그인은 무시됩니다. 문제가있는 사용자 중 하나는 내가 등 다른 브라우저를 시도, 다시 로그인을 포함하여 다양한 것들을 시도해 그를지고있어 그래서 친구이며, 쓰기 45 분 보낸 이후, 어쨌든

일어나고 유지 이 게시물 ... 사용자의

하나는 트위터를 통해 응용 프로그램에 대한 액세스 권한을 취소하고 재 인증. 모든 것이 지금 작동합니다.

대체 무엇입니까?

그의 이전 신원은 입니다. 그의 OAuth 토큰 등이 올바르게 저장되어 있습니다.

다행히도 이것은 한 사용자에 대해 해결되었지만 분명히 진행중인 문제입니다.

우리는 무엇을해야합니까?

답변

0

라인의 Identity.from_omniauth이 자동으로 실패 할 가능성이 있습니까?그렇다면 after_create 후크가 실행되지 않고 @identity.personnil이되며 방금 리디렉션됩니다.

시도 identity.save!?

+0

나는 그렇게 생각하지 않는다. 각 사용자에게 영향을 미쳤다. 유효하고 완전한 Identity & Person 필드 =/ –

+0

'PersonMeta'와'nil'' person_id 데이터베이스에? – nickgrim

+0

아니요 - 제대로 생성되었거나 존재하지 않습니다. –

관련 문제