質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

851閲覧

「外部サービスへの認証」を共通化し、各ページで使いまわしできる設計にしたい

pecchan

総合スコア592

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/10/28 00:14

編集2021/10/28 00:18

rails6.1.0

どちらかと言うと、プログラム設計に関する質問になります。
初心者につきどのように設計したら良いか分からずにいます。

昨日もこちらで質問させていただいた関連になります。
回答いただき、プログラム設計を頑張ってみましたが解決できずにいます。

###状況
railsアプリに「ソーシャルログイン機能」を実装しました。
これに伴い「外部サービス連携(連携のON/OFFを切り替えるページ)」に取り掛かっているところです。

###困っていること
ログイン時と外部サービス連携設定時では「外部サービスへの認証」部分は同じですが、認証後のページ遷移先が異なります。

例えば
・ログインページだと、認証後はダッシュボードに遷移
・外部サービス連携ページだとajaxで描画するだけなので遷移不要

このため「外部サービスへの認証」部分だけを共通化して各ページで使いまわしたいのですが、上手く設計できずにいます。

###試したこと

認証部分をコントロールとして切り出しました。

app\controllers\concerns\omniauth_callbacks.rb

ruby

1class OmniauthCallbacksController < ApplicationController 2 3 def hoge 4 user_hash = auth_hash 5 end 6 7 private 8 9 def auth_hash 10 request.env['omniauth.auth'] 11 end

これを必要なページ(コントローラ)に継承させました。
app\controllers\sns_connects_controller.rb

ruby

1class SnsConnectsController < OmniauthCallbacksController 2 def update 3 # 認証のONに伴い外部サービス認証する 4 end 5end 6 7class SessionesController < OmniauthCallbacksController 8 def create 9 # ログインに伴い外部サービス認証する 10 end 11end

\app\views\sns_connects\index.html.erb

ruby

1<%= link_to "Google連動する", "/auth/google_oauth2", method: :post %>

\config\routes.rb

ruby

1get 'auth/:provider/callback', to: 'omniauth_callbacks#hoge'

ここまで書いて気付きましたが、これだと継承元である「OmniauthCallbacksControllerのhoge 」へ飛ぶだけで継承先には制御は渡ってきません。

実際動かすと、
OmniauthCallbacksControllerのhogeを抜けて処理が終わります。
当たり前と言えば当たり前ですが・・・。

どうすれば継承先に制御がうつるでしょうか?
そもそもこの方法じゃ無理でしょうか?

他にミックスインも試しましたがミックスインの形にすると上記のルーティングが呼べませんでした。

このルーティング部分(プロバイダ先にリクエストを送る)というのが自分には足かせになってて上手く設計できずにいます・・・。

###補足
「外部サービス認証」は、

ruby

1<%= link_to "Google連動する", "/auth/google_oauth2", method: :post %>

を踏むことで飛んでいき認証します。
その戻り先がルーティングに指定した、
to: 'omniauth_callbacks#hoge'
になります。

先輩方どうかアドバイスお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

どうすれば継承先に制御がうつるでしょうか?

omniauth_callbacks#hogeから適切なページへリダイレクトさせればいいのではないでしょうか。

投稿2021/10/28 00:34

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pecchan

2021/10/28 00:52

昨日に続き有難う御座います。 なるほどです。その方法で考えてみました。 その場合、リダイレクト先を判定する処理が必要なため、呼び出し元から何かパラメータを渡す必要があるかと思いますが、呼び出し元のリンクが認証先プロバイダ経由のため、POSTで追加のパラメータを渡せないようです。 <%= link_to "Google連動する", "/auth/google_oauth2", method: :post %> 何か方法はあるでしょうか? ログイン前なのでセッションもsessionを使うのも違うのかなと思うのですがどうなんでしょうか? 重ねての質問すみません。
maisumakun

2021/10/28 00:56

> ログイン前なのでセッションもsessionを使うのも違うのかなと思うのですがどうなんでしょうか? いえ、セッションも1つの手段です。
neko_daisuki

2021/10/28 02:31

omniauth-twitter では、 <%= link_to "twitter", "/auth/twitter?app=teratail", method: :post %> とすると、omniauth_callbacks#hoge で params[:app] に値が入ります。 Google でも同様に動作するなら、この値を見て振り分けたら良いと思います。
pecchan

2021/10/28 02:42

neko_daisuki様 有難う御座います。 試しましたがgoogle_oauth2では渡せませんでした。 (paramsの中に:app無し) twitterのようだったら良かったのですが・・・orz
pecchan

2021/10/28 09:05

セッションでいってみます! 有難う御座います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問