rails6 + deviseを使ってYahoo認証機能を作る！

<h1>rails6でYahoo認証機能を作る。</h1>



<h3>DeviseとOmniauthをインストール</h3>

Gemfileに記載します。

```rb
gem 'devise'
gem 'omniauth'
gem 'omniauth-yahoojp'

```

⇃

```
$ bundle install
```

これでdevise omniauth omniauth-yahoojpがbundle installされました！

<h3>Devise設定など</h3>

```
 $ rails g devise:install

 $ rails g devise user 

 $ rails g devise:views

 $ rails g devise:controllers users
```
これらを実行します。

そして、app/models/user.rbに

```rb
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
```
とあるとおもいますが　これに

```rb
  :omniauthable, omniauth_providers: [:yahoojp]
```
これを追加してください。

ちなみにこれは　omniauthableをこのモデルで使用するよ　的な感じです。

つぎにuserモデルに
name provider uid を追加して、yahooのデーターを保存するカラムを追加してあげます。

```
 $ rails g migration AddOminiauthToUsers 
```
と実行して、migrationファイルができるはずなので

できたmigrationファイルに

```rb
  def change
    add_column :users, :uid, :string
    add_column :users, :provider, :string
    add_column :users, :token, :text
  end
```
を記述してあげてください。

そして

```
 $ rails db:migrate
```

そしたらカラム追加されてるはずです！

<h3>YahooのKeyとかを取得する。</h3>

https://e.developer.yahoo.co.jp/dashboard/
このURLにアクセスして、
新しいアプリケーションを開発を　押してください。
<hr>
![コメント 2020-04-18 142131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565846/696efac7-719e-54e7-2992-d2793a33c6d4.png)

<hr>
⇃するとこのような画面になりますが

<hr>
![コメント 2020-04-18 142302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565846/0f7176bb-a446-47bd-a073-15c6322141f7.png)

<hr>
このサイトURLを
localhost:3000
にしてあげてください。
サイト名とかアプリケーションの説明はご自由に。
そして登録してあげます。
<br>
登録してから、もう一回アプリケーションの管理に戻って、次はコールバックURLを設定してあげます。

![コメント 2020-04-18 142904.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565846/ed1569c2-b025-0c06-2791-c83acc77f29f.png)

このように　localhost:3000/users/auth/yahoojp/callback

としてあげます。

<h3>環境変数設定</h3>
Gemfileに

```rb
gem 'dotenv-rails'
```
を追加して

```
$ bundle install
```

そして、　.envファイルを追加してあげて

.envファイルに

```
YAHOOJP_KEY="YAHOOのClientIDを記述"
YAHOOJP_SECRET="YAHOOのシークレットキーを記述"
```

そして、.gitinoreファイルに

```
/.env
```
と書いてあげます。　これでシークレットキーとClientIDを環境変数として使うことができます！

ちなみにシークレットキーとClientIDはばれてはまずいので気を付けて。

<h3>Yahoo認証を実装していく</h3>

routes.rb

```rb
 devise_for :users
```
となってるとおもいますが

```rb
devise_for :users, controllers: {
    omniauth_callbacks: "users/omniauth_callbacks"
}

  get '/auth/:provider/callback' => 'users/omniauth_callbacks#yahoojp', as: "helloyahoo"  #　←これ居るかわからないけど一応。。
```
と追加してあげてください。

config/devise.rbに

```rb

  config.omniauth :yahoo_jp, ENV['YAHOOJP_KEY'], ENV['YAHOOJP_SECRET'] #必要なのかわからないけど一応..

```

config/initializers/omniauth.rbファイル追加

omniauth.rbに

```rb
Rails.application.config.middleware.use OmniAuth::Builder do
        provider :yahoojp, ENV['YAHOOJP_KEY'], ENV['YAHOOJP_SECRET'], 
        {
                :scope => 'openid profile email address'
                # :provider_ignores_state => true  これを追加するのはおすすめしません。
        }
end

```

そして、user.rbに

```rb
  def self.find_for_yahoo_jp(auth)
    user = User.where(email: auth.info.email, provider: auth.provider).first
    unless user
      user = User.create!(name: auth.info.name,
                          provider: auth.provider,
                          email: auth.info.email,
                          uid: auth.uid,
                          token: auth.credentials.token,
                          password: Devise.friendly_token[0, 20])
    end
    user
  end
```

を追加。

そしてapp/controllers/users/omniauth_callbacks_controller.rb
に

```rb
  def failure
    @user = Sns.find_for_yahoo_jp(request.env['omniauth.auth'])
    if @user.persisted?
           flash[:notice] = I18n.t 'devise.omniauth_callbacks.success', 
                       :kind => "Yahoo"
      sign_in_and_redirect @user, :event => :authentication
    else
      session['devise.yahoo_data'] = request.env['omniauth.auth'].except("extra")
      redirect_to new_user_registration_url
    end
  end
```
を追加。

app/views/devise/registrations/new.html.erbに

```erb
<h2><%= link_to "Yahoo! JAPAN で登録",user_yahoojp_omniauth_authorize_path %>
```

これでできたとおもいます。

<h3>参考</h3>

http://mikanmarusan.hatenablog.com/entry/20130305/1362439681

http://mikanmarusan.hatenablog.com/entry/20130305/1362439681

<h3>終わりに</h3>

エンジニアの方がコメントさせていただけました。

アドバイスコメントを読んでみてください。

https://qiita.com/asobisarch/items/0c61aead27dbbc55484d#comments

ということで、RailsでYahooログイン認証を作ってる記事があまりにも少なくて　かなり苦戦しました。

なにか間違いなどあったらコメントください。
おねがいします。