-
Notifications
You must be signed in to change notification settings - Fork 72
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
外部サービスで BootCamp ログインができるようにした(OAuth2.0 プロバイダー機能実装) #8250
base: main
Are you sure you want to change the base?
Conversation
3eef673
to
c732675
Compare
5054dda
to
32ff385
Compare
32ff385
to
2aa7f4d
Compare
43ca3d7
to
45e4c13
Compare
45e4c13
to
1c962e6
Compare
|
||
class Oauth2ProviderTest < ApplicationSystemTestCase | ||
setup do | ||
visit_with_auth root_path, 'komagata' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
setup do で管理者ログインの処理を共通化している理由について説明します。
他のテストファイルと同様に、各テストで visit_with_auth メソッドを使用してログイン後にテストを継続しようとすると、意図せずログイン画面にリダイレクトされてしまい、テストが失敗します。
そのため、以下のように setup do 内でルートパス (root_path) に一度遷移し、Oauth2 Provider の画面へアクセスする流れを確立してから、アプリの CRUD 操作をテストするようにしました。
各テスト内でログイン処理を行った場合のテストコード
test 'admin can access oauth2 provider page' do
visit_with_auth oauth_applications_path, 'komagata'
assert_equal 'Oauth2 Provider', title
end
実行結果
$ bin/rails test test/system/oauth2_provider_test.rb:15
Running via Spring preloader in process 17722
Run options: --seed 45277
# Running:
[Screenshot Image]: /Users/mikoto/projects/bootcamp/tmp/screenshots/failures_test_admin_can_access_oauth2_provider_page.png
F
Failure:
Oauth2ProviderTest#test_admin_can_access_oauth2_provider_page [/Users/mikoto/projects/bootcamp/test/system/oauth2_provider_test.rb:17]:
--- expected
+++ actual
@@ -1 +1 @@
-"Oauth2 Provider"
+"ログイン | FJORD BOOT CAMP(フィヨルドブートキャンプ)"
rails test test/system/oauth2_provider_test.rb:15
このように、ログインページへリダイレクトされてしまい Oauth2 Provider の画面にアクセスできませんでした。
対策として今回のように setup do でログイン処理を共通化し、テストが期待通り動作するようにしています。
@SuzukiShuntarou |
@MikotoMakizuru |
前置き
レビュー
レビュー1:
|
3a5cbaf
to
d95771a
Compare
bb4bf65
to
176157a
Compare
レビューありがとうございます!また、ペアプロの時間もいただきありがとうございました。お話した内容も含めて、こちらにまとめておきます。
とんでもございません!できる範囲でレビューしていただき、とても感謝しております🙏 私も OAuth2.0 Provider 機能や doorkeeper の使い方については手探りで進めていたため、同じ状況でした。
不要だったので削除しました。
認証画面のデザイン(アプリの管理画面も含め)は、doorkeeper がデフォルトで提供しているものなので、細かなレイアウト調整が難しいです。もし細かな調整をする場合は View を作る必要があります。添付いただいた画像のプロンプトは、本来認証サンプル画像のように、「・Read」や「・Write」など 承認するとクライアントアプリができるようになること記載します。 そのため doorkeeper 側のデザインも width 確認画像 のように 260px の幅しか設けていないため、長いプロンプトを書こうとすると改行が発生します。 ただ、「読み取り」とだけ書かれていても、ユーザは何を読み取るのかわからないのでは?と思い、Google OAuth 認証画面(少し古いものですが)を参考に、今回のプロンプトを作成しました。 しかし、ペアプロでもお話ししたように、
といった点があるため、町田さんにもご意見を伺いたいと思います。 認証サンプル画像 width 確認画像 Google OAuth認証画面 また、ペアプロでいただいた「後置 if を使わずに論理積 (&&) を使ったほうがよいのでは?」という点についてですが、個人的には好みの問題かと思いました。 論理積を使った書き方 def set_user
@user = if params[:id] == 'show' && doorkeeper_token
User.find(doorkeeper_token.resource_owner_id)
else
User.find(params[:id])
end
end 後置ifを使った書き方 def set_user
@user = if params[:id] == 'show'
User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token
else
User.find(params[:id])
end
end |
@MikotoMakizuru
|
@SuzukiShuntarou @machida |
未使用のルートとして doorkeeper/authorizations#show を無視する設定を .traceroute.yml に追加
This reverts commit 176157a.
f951bc1
to
8377a6c
Compare
Issue
OAuth2 Providerの機能が欲しい #8102
概要
OAuth 2.0 プロバイダー機能を実装しました。これにより、BootCamp のユーザ情報を外部サービスに提供できるようになります。
この機能を利用すると、新たに立ち上げたアプリに BootCamp のログイン機能を実装した場合、ユーザは新規登録をせずに、既存の BootCamp アカウントでログインできます。つまり、ユーザ登録の手間を省き、プロセスを簡素化できます。
ユースケースの一例として、フィヨルドブートキャンプ生が個人開発の課題として BootCamp に関連するサービスを作成する際、新規アカウントを作成することなく、BootCamp アカウントでログインできるようになります。
変更確認方法
git clone
.env
ファイルを作成.env
ファイルに下記の OAuth2.0 クライアントの設定 を記載feature/oauth2-provider-doorkeeper
ブランチをローカルに取り込むkomagata
)でログインhttp://localhost:3001/users/auth/doorkeeper/callback
DOORKEEPER_APP_ID
とDOORKEEPER_APP_SECRET
にペースト3000
ポートを使用している場合、bin/rails s -p 3001
など別のポートで起動)rails console
を起動し、User.all
を実行してユーザが存在しないことを確認http://localhost:3001/
にアクセス(このブラウザで BootCamp にログインしている場合は事前にログアウトしておく)kimura
ユーザとしてログインし、再度http://localhost:3001/
へアクセスkimura
ユーザとしてログインできることを確認rails console
を起動し、User.all
を実行してログインしたユーザが存在していることを確認OAuth0.2 クライアントの設定
Screenshot
変更前
管理者メニューに「OAuth2 Provider」が無い
変更後
管理者メニューに「OAuth2 Provider」を追加
アプリ一覧画面
アプリ新規追加画面
アプリ編集画面
プロフィール情報読み取り認証画面
アプリ認証失敗時のエラー画面(主に「Application ID」や「Secret」が正しく設定されいないときに表示されます)
Redirect URL 先が無効な時に表示されるエラー画面
BootCamp ログインするまでの動作確認動画
2025-02-09.1.48.05.mov
補足
OAuth とは
OAuth の仕組みについて以下の記事が、とてもわかりわかりやすく参考になりました。
show API が提供するユーザ情報
show API が提供するユーザ情報は以下のファイルに記載されている内容に基づいています。
(API の仕様は今後変更される可能性があるため、ここでは項目を詳細に記載しません)
OAuth2 用のテーブル追加
今回の実装により以下3つのテーブルが追加されます。
以下のドキュメントにカラムの説明などが記載されています。
Users テーブルとの関連
OAuth2 の各テーブルと Users テーブルの関連性を以下に示します。
oauth_applications
:id が oauth_access_tokens.application_id と oauth_access_grants.application_id に紐づくoauth_access_tokens
:resource_owner_id が users.id に紐づくoauth_access_grants
:resource_owner_id が users.id に紐づくERD
OAuth2 の各テーブルと Users テーブルの関連性を示した ERD は次のようになります。