2014-02-13 5 views
0

내 사이트에서 Twitter를 구현하고 트위터 omniauth로 등록하려고합니다. 나는 this Railscast을 팔로우했는데, "twitter로 로그인"링크를 클릭하면 401 Unauthorized이 나타납니다.Omniauth가 401 권한이 없음을 반환합니다.

GET "https://stackoverflow.com/users/auth/twitter/callback?oauth_token=xxx&oauth_verifier=xxx 
omniauth: (twitter) Callback phase initiated. 
Processing by OmniauthCallbacksController#twitter as HTML 
    Parameters: {"oauth_token"=>"xxx", "oauth_verifier"=>"xxx"} 
    User Load (1.3ms) SELECT "users".* FROM "users" WHERE "users"."provider" = 'twitter' AND "users"."uid" = '9999' ORDER BY "users"."id" ASC LIMIT 1 
    (0.3ms) BEGIN 
    (0.2ms) COMMIT 
Completed 401 Unauthorized in 13ms 

나는 omniauth 컨트롤러에서 보면, 그것은 사용자를 발견했다,하지만 sign_in_and_redirect user 줄에 실패 할 것 : 나는 로그에서 볼 때 나는 이것이 참조하십시오.

내가 키와 비밀이 같은 추가 한 config/devise.rb에서
class OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def all 
    user = User.from_omniauth(request.env["omniauth.auth"]) 
    if user.persisted? 
     # it reaches this 
     flash.notice = I18n.t('.devise.omniauth_callbacks.success') 
     sign_in_and_redirect user 
    else 
     session["devise.user_attributes"] = user.attributes 
     redirect_to new_user_registration_url, notice: I18n.t('.devise.omniauth_callbacks.failure') 
    end 
    end 
    alias_method :twitter, :all 
end 

: 다음 실제 값은 다음과 같이 .rvmrc에 저장됩니다

config.omniauth :twitter, ENV.fetch("TWITTER_CONSUMER_KEY"), ENV.fetch("TWITTER_CONSUMER_SECRET") 

그리고는 :

export TWITTER_CONSUMER_KEY=xxx 
export TWITTER_CONSUMER_SECRET=xxx 

이 아마 것을 의미한다 찾은 사용자를 로그인하려고 시도하지만 일부 유효성 검사가 실패합니다. 그러나 사용자 모델의 모든 유효성 검사를 제거하여 어떤 일이 발생했는지 확인하고 난 후에도이 오류가 발생합니다. 여기에 뭐가 잘못 됐는지 아무도 모르는 사람?

+0

'current_user'를 포함하는'before_filter' 또는'before_action'에 대해'ApplicationController'를 검사하십시오. 당신이'OmniauthCallbacksController'에서 인증을 요구할 때 필요합니다. – Ashitaka

답변

0

문제는 strong parameters이어야합니다. 나는 당신이 원하는 모든 것을 request.env["omniauth.auth"]에서 직접 생성이나 찾기를 위해 사용하는 대신에 몇 가지 변수에 넣으라고 제안합니다.

def self.from_omniauth(auth) 
uid = auth[:uid] 
provider = auth[:provider] 

User.where(provider: provider, uid: uid).first 
end 

이렇게하면 인증되지 않은 오류가 해결됩니다.

+0

당신이 옳았습니다. 허용 된 devise sign_up 매개 변수에''provider''와''uid''를 추가하는 것을 잊었습니다. 고마워요! – John

1

동일한 문제가 있었지만 ("Omniauth는 401 권한을 반환합니다") 원인은 다릅니다. 내 User#from_omniauth에서

나는이 아직 없었다 경우 새 사용자가 만들어집니다이

where(provider: auth.provider, uid: auth.uid).first_or_create 

않습니다. 또한 Userdevise :confirmable이고 확인되지 않은 사용자는 로그인 할 수 없습니다. 따라서 인증에 실패했습니다.

하지만이 없었다에 내가 리디렉션 된보기에,이 없다는 오류 메시지가 계속 것 : 그래서

<p class="notice"><%= notice %></p> 
<p class="alert"><%= alert %></p> 

, 솔루션이 CallbacksController의 방법이 추가되었다 :

def github 
    @user = User.from_omniauth(request.env['omniauth.auth']) 

    if @user.persisted? 
    @user.skip_confirmation! 
    @user.save 
    #... 

skip_confirmation는 유증 방법이며 사용자에서이 작업을 수행합니다

self.confirmed_at = Time.now.utc 

이렇게, 다른 방법으로 이것을 수행 할 수있다. User.from_omniauth

+0

또한 작동하게하려면'devise : confirmable'을 제거해야합니다. 고마워요 @ 보스 코 비치 –

관련 문제