4

Rails アプリケーションに omniauth-linkedin gem を使用しています。

https://github.com/skorks/omniauth-linkedin

LinkedIn の新しいアクセス許可要求の手順と範囲を考慮する必要がありますが、メール アドレスまたは完全なプロファイル (既定のプロファイルの概要以外のもの) を取得できません。

ここに私の omniauth.rb ファイルがあります:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :linkedin, ENV['LINKEDIN_KEY'], ENV['LINKEDIN_SECRET'], :scope => 'r_fullprofile r_emailaddress'
end

ユーザーが資格情報を入力する前に、完全なプロファイルと電子メール アドレスの要求が最初に LinkedIn に送られます。ただし、スコープ要求はユーザーがサインインすると失われ、既定のプロファイルの概要情報のみにアクセスできます。

私の問題は、gem ページ (https://github.com/skorks/omniauth-linkedin) に記載されているように、必要なスコープ内でこれらのフィールドを具体的に要求する必要があることに関係していると思います。それでも、特定のフィールド リクエストを omniauth.rb ファイルに追加しようとしましたが、成功しませんでした (以下のメール フィールド リクエスト)。

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :linkedin, ENV['LINKEDIN_KEY'], ENV['LINKEDIN_SECRET'], :scope => 'r_fullprofile+r_emailaddress',
  :fields => ["id", "email-address", "first-name", "last-name", "headline", "industry", "picture-url", "public-profile-url", "location", "positions", "educations"]
end

どうやら、後者のデフォルト以外のフィールドにアクセスするには、メールアドレス、役職、学歴などのデフォルト以外のフィールドに加えて、プロファイル概要のデフォルト フィールドを要求することになっているようです。

LinkedIn のメールアドレスは、役職や学歴のように構造化されたオブジェクトではないため、わかりやすいものにする必要があります。希望する役職や学歴内の特定のフィールドのコードが不足していると思います (どのように記述すればよいかわかりません。それも入力してください)。新しい API キーを使用しているため、何が問題なのかわかりません。LinkedIn から何らかの特別な許可が必要ですか? 助けていただければ幸いです。ありがとうございました。

また、これが私の認証コントローラーに関連するコードです。

require 'linkedin'

class AuthController < ApplicationController

  def auth
    client = LinkedIn::Client.new(ENV['LINKEDIN_KEY'], ENV['LINKEDIN_SECRET'])

    request_token = client.request_token(:oauth_callback => 
                                      "http://#{request.host_with_port}/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(ENV['LINKEDIN_KEY'], ENV['LINKEDIN_SECRET'])

    if current_user.atoken.nil? && current_user.asecret.nil?
      pin = params[:oauth_verifier]
      atoken, asecret = client.authorize_from_request(session[:rtoken], session[:rsecret], pin)
      current_user.atoken = atoken
      current_user.asecret = asecret
      current_user.uid = client.profile(:fields => ["id"]).id
      flash.now[:success] = 'Signed in with LinkedIn.'
    elsif current_user.atoken && current_user.asecret 
      client.authorize_from_access(current_user.atoken, current_user.asecret)
      flash.now[:success] = 'Signed in with LinkedIn.'
    end
4

1 に答える 1

3

これが最もエレガントなソリューションかどうかはわかりませんが、これは私にとってはうまくいきました

request_token_path で渡されたスコープで構成を追加しました

LINKEDIN_CONFIGURATION = { :site => 'https://api.linkedin.com',
:authorize_path => '/uas/oauth/authenticate',
:request_token_path =>'/uas/oauth/requestToken?scope=r_basicprofile+r_emailaddress+r_network+r_contactinfo',
:access_token_path => '/uas/oauth/accessToken' }

client = LinkedIn::Client.new(LINKEDIN_API_KEY, LINKEDIN_SECRET_KEY, LINKEDIN_CONFIGURATION )

残りのコードは同じです。

コールバック メソッドのクライアント コンストラクターも必ず変更してください。

于 2012-09-08T15:07:43.943 に答える