Пользователи должны входить в Instagram, запись должна быть создана

#ruby-on-rails #oauth #instagram-api

#ruby-on-rails #oauth #instagram-api

Вопрос:

Я просто хочу, чтобы user devise oauth разрешал пользователям входить в мое приложение со своей учетной записью Instagram. я попробовал несколько руководств, видеороликов devcamp и railscast, но просто не могу заставить это работать. есть ли рабочее пошаговое руководство о том, как реализовать omniauth для instagram с помощью devise?

каждый раз, когда я хочу прочитать документы, я просто запутываюсь, поскольку instagram вставляет МНОГО кода всего в один блок, без объяснения, к чему относится этот код. также они никогда не используют обычный встроенный ruby, вместо этого они используют haml и прочее.

на данный момент я получил это:

omniauth_callbacks_controller:

 class OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def instagram
  end
end
  

routes.rb

   devise_for :users, controllers: {omniauth_callbacks: "omniauth_callbacks"}
  

initializers/devise.rb

 config.omniauth :instagram, ENV["INSTAGRAM_CLIENT_ID"], ENV["INSTAGRAM_CLIENT_SECRET"] 
# i had plain text instead of the env tags, but it made no difference
  

в моем user.rb я поместил некоторый код с сессионными материалами, которые я действительно не понимаю, но это тоже не сработало.

Ответ №1:

пример кода

 class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def instagram
    session["devise.instagram_data"] = request.env["omniauth.auth"]

    if user = User.from_omniauth(request.env["omniauth.auth"])
      sign_in_and_redirect user
    else
      redirect_to new_user_registration_path
    end
  end

  def failure
    redirect_to root_path
  end
end

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :omniauthable, omniauth_providers: [:instagram]

  def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).take
  end

  def self.new_with_session(params, session)
    super.tap do |user|
      if data = session["devise.instagram_data"]
        user.uid = data["uid"]
        user.provider = data["provider"]
        user.password = Devise.friendly_token
      end
    end
  end
end
  

Полный пример здесь https://github.com/germanescobar/rails-devise-instagram/blob/master/app/models/user.rb

Комментарии:

1. спасибо за ваш ответ. к сожалению, у меня это все еще не работает. я просто перенаправляюсь на new_user_registration_path , как указано в контроллере обратного вызова.