2012-02-20 2 views
1

Linkedin에 잠시 동안 성공적으로 연결되었습니다. 그러나 우리는 수시로 약간의 오류가 발생하며, 누군가가이를 비추는 것을 도울 수 있기를 희망합니다. 여기에 코드가 있습니다 :Oauth with Rails

def linkedin_login 
    request_token = Linkedin.client.request_token(oauth_callback: "http://#{SITE_URL}/linkedin/auth/") 
    session[:linkedin_request_token] = request_token.token 
    session[:linkedin_request_secret] = request_token.secret 
    redirect_to request_token.authorize_url 
end 

def linkedin_auth 
    raise "Don't have proper session or oauth_verifier" if session[:linkedin_request_token].blank? or session[:linkedin_request_secret].blank? or params[:oauth_verifier].blank? 
    access_token = Linkedin.client.authorize_from_request(session[:linkedin_request_token], session[:linkedin_request_secret], params[:oauth_verifier]) 
    raise "Nil access token" if access_token.blank? 
    redirect_to linkedin_process_path(token: access_token.first, secret: access_token.second) 
end 

기대하는 것보다 "올릴 세션이 없거나 oauth_verifier가 없습니다"라는 메시지가 나타납니다. 오류에 대한 ENV를 볼 때 해당 사람들은 원래 방법으로 설정된 세션 값을 가지고 있지 않습니다. 우리는 before_filters를 응용 프로그램 컨트롤러에 설정하여 세션을 초기화하므로 활성화되어 있습니다.

내 다음 생각은 "request_token"이 request_token 값을 생성하는지 여부이고 나는 여러 번 시도해 보았습니다. 그리고 그들은 모두 다시 뭔가를 가져 왔습니다. 우리는 하루에 이것들을 많이 얻습니다. 오류가 발생한 후 사용자가 다시 시도하면 제대로 작동하므로 혼란 스럽습니다.

이 문제의 원인에 대한 의견이 있으십니까?

답변

4

코드에 따르면 사용자가 응용 프로그램에 로그인 할 때마다 요청 토큰을 호출하는 것처럼 보입니다. 그것은 인증하는 적절한 방법이 아닙니다. 실제로는 요청 토큰을 한 번 가져온 다음 링크 토큰 (linkedin_auth 메소드에서 수행하는 것처럼)을 사용하여 액세스 토큰을 업그레이드해야합니다. 거기에서 액세스 토큰과 비밀을 DB에 저장하고 특정 사용자에 대해 API 호출을해야 할 때마다 가져옵니다.

우리의 인증은 여기에 더 자세히 설명되어 https://developer.linkedin.com/documents/authentication

는 또한,이 단지 개인적인 취향이지만, 링크드 인 래퍼를 사용하는 것이 아니라 내가 레일에 대한 OAuth는 보석을 사용하여 좋아합니다. 사용하기 쉽고 가벼운 무게입니다.

그냥 예를 들어, 당신은 당신의 인증이 방법을 수행 할 수 있습니다 : 당신은 사용자가 먼저 응용 프로그램을 승인 할 때이 메소드를 호출 할 필요가

require 'oauth' 

def auth 

    api_key = 'XXXXXXXXX' 
    api_secret = 'XXXXXXXXX' 
    configuration = { :site => 'https://api.linkedin.com', 
        :authorize_path => 'https://www.linkedin.com/uas/oauth/authenticate', 
        :request_token_path => 'https://api.linkedin.com/uas/oauth/requestToken', 
        :access_token_path => 'https://api.linkedin.com/uas/oauth/accessToken' } 

    consumer = OAuth::Consumer.new(api_key, api_secret, configuration) 

    #Request token 
    request_token = consumer.get_request_token 

    # Output request URL to console 
    puts "Please visit this URL: https://api.linkedin.com/uas/oauth/authenticate?oauth_token=" + request_token.token + " in your browser and then input the numerical code you are provided here: " 

    # Set verifier code 
    verifier = $stdin.gets.strip 

    # Retrieve access token object 
    @access_token = request_token.get_access_token(:oauth_verifier => verifier) 
end 

. 액세스 토큰을 저장 한 후 후속 API 호출에 사용하십시오. 참고로,이 예에서는 콘솔을 사용하여 PIN 확인 프로그램을 시작합니다. 실제 예에서 세션 변수 나 메모리에 프로그래밍 방식으로 PIN을 저장 한 다음 PIN을 사용하여 액세스 토큰을 얻으려고합니다.