0

私の session_controller.rb には次のものがあります。

require 'linkedin'

class SessionController < ApplicationController

  def connect

    # get your api keys at https://www.linkedin.com/secure/developer
    client = LinkedIn::Client.new(APP_CONFIG['linkedin']['apikey'], APP_CONFIG['linkedin']['secret_key'])
    request_token = client.request_token(:oauth_callback => 
                                      "http://#{request.host_with_port}/session/callback")
    session[:rtoken] = request_token.token
    session[:rsecret] = request_token.secret

    redirect_to client.request_token.authorize_url

  end

  def callback

    client = LinkedIn::Client.new(APP_CONFIG['linkedin']['apikey'], APP_CONFIG['linkedin']['secret_key'])
    if session[:atoken].nil?
      pin = params[:oauth_verifier]
      atoken, asecret = client.authorize_from_request(session[:rtoken], session[:rsecret], pin)
      session[:atoken] = atoken
      session[:asecret] = asecret
    else
      client.authorize_from_access(session[:atoken], session[:asecret])
    end

    redirect_to 'users/index'

  end

end

これは非常にうまく機能します。私が今抱えている問題は、ユーザーが Linkedin の OAuth プロセスを経たかどうかにかかわらず、'users/index' アクションをチェックインする方法です。これが私がやろうとしていることの始まりです:

    class UsersController < ApplicationController
      respond_to :html, :js, :json

      def index
          if authenticated?
              # set up a new LinkedIn client and show profile data
          else 
              redirect_to 'session/connect'
          end
      end

      ...

    private
      def authenticated?
          # what should i do here?        
          # return true if the user authenticated
          # return false if not
      end

セッションに値が設定されているかどうかを確認する必要があることはわかっていますが、正確にどれを探しているのかわかりません。将来的には、おそらく「認証済み?」メソッドなので、すべてのビューで呼び出されますが、これは問題ありません。

何か助けはありますか?ありがとう!

4

1 に答える 1

2

私がこの問題に対処した方法は、atoken と asecret の値をユーザー データベースの列に保存することでした。次に、ユーザーが Linkedin の OAuth プロセスを経たかどうかを確認する必要がある場合、それらの変数が存在するかどうかを確認します。私のコールバック メソッドは、atoken と asecret を格納するための 2 つの行が追加されている点を除けば、あなたのものと非常によく似ています。

def callback
  @user = current_user
  client = LinkedIn::Client.new("API Key", "Secret Key")
    if session[:atoken].nil? || session[:atoken]==""
      @pin = params[:oauth_verifier]
      atoken, asecret = client.authorize_from_request(session[:rtoken], session[:rsecret], @pin)

      #Used to Store atoken and asecret for user
      current_user.update_attribute(:link_tok, atoken)
      current_user.update_attribute(:link_sec, asecret)

    else
      client.authorize_from_access(current_user.link_tok, current_user.link_sec)
    end

    sign_in @user 
    flash.now[:success] = "You can now import data from LinkedIn to complete your profile"     
    render 'settings'
end

また、参考までに、LinkedIn にはサードパーティ アプリケーションが API からユーザー データを保存することについて厳格なポリシーがあるため、これを行う前に、すべての適切な権限が適切に設定されていることを確認する必要があります。

于 2012-08-29T22:06:11.720 に答える