# bapi_costomerについて確認しておきたいこと。 前提: - bapi_customerのアプリケーションに、COMPASSではない別会社のAIチャットbotの管理APIを追加したい - 既存の認証やsessionを今回のAIチャットbotでも使用したい。 - 既存のbapi_costomer認証周りの仕様を把握したい。 目的: bapi_costomerの認証周りとセッションの管理の現状の仕様に関して把握をしたい。 ## 現状の把握 該当の場所。 ``` bapi_customer_gitlab/app/controllers/api/v1/auth/sessions_controller.rb ``` 該当のソースコード ``` module Api module V1 module Auth class SessionsController < DeviseTokenAuth::SessionsController before_action :set_user_by_token, only: %i[destroy] def create super do |resource| resource.regenerate_refresh_token resource.save end end def destroy @resource.update!(refresh_token: nil) if @resource.present? super end def refresh @resource = CustomerMybear.where(provider: 'email', uid: request.headers['uid']).find_by(refresh_token: request.headers['refresh-token']) return render_refresh_error_bad_credentials if @resource.blank? return render_invalid_error_token_expired if @resource.refresh_token_expired_at < Time.zone.now client = request.headers['client'] @resource.tokens.delete(client) @resource.update!(refresh_token: nil) @token = @resource.create_token @resource.regenerate_refresh_token @resource.save! sign_in(:user, @resource, store: false, bypass: false) render_create_success end protected def render_create_success render json: { customer_id: @resource.customer_id } end def render_destroy_success render json: {} end def render_refresh_error_bad_credentials render_error(404, '現在ログインしていないか、トークンリフレッシュ用の認証情報が間違っています。再度ログインし直すか、新規にアカウントを作成してください。') end def render_invalid_error_token_expired render_error(404, 'リフレッシュトークンの有効期限が切れています。再度ログインしてください。') end def render_create_error_account_locked error_text = 'あなたのアカウントはロックされています。ロック解除をご希望の場合は弊社カスタマーサポート(03-5640-0736 ※9:00〜20:00)までお問合せください。' render_error(401, error_text, { "display_error": [error_text] }) end def render_create_error_bad_credentials error_text = 'ログイン用の認証情報が正しくありません。再度お試しください。' render_error(401, error_text, { "display_error": [error_text] }) end end end end end ``` リフレッシュトークンの管理を↑のソースコードではしているのかと思います。 全体的なDeviceの認証認可のシステムや、セッションの管理について詳しくないので仕様を教えていただきたいです。 [リフレッシュトークンについての参照](https://auth0.com/blog/jp-refresh-tokens-what-are-they-and-when-to-use-them/) ![](https://i.imgur.com/8jL5EWM.png) こちらのようなことを全体的に行なっているのではないかと思っているのですが、認識はあってますでしょうか? ## ソースコードから リフレッシュトークンがある場合にはアクセストークンが存在している認識なのですが、別に管理をしている場所があるということであってるのか? その場合、具体的には以下がアクセストークンだと思っているのですが、認識あってますか? ``` staff_my_bearsテーブルの {"token":"$2a$10$0SJg53pcG.zhoUNvSZaMDu2e9IyxgrInwfWwPEkrNzfNvLlkbYyUa" ``` 該当メソッドdef refresh ``` def refresh @resource = CustomerMybear.where(provider: 'email', uid: request.headers['uid']).find_by(refresh_token: request.headers['refresh-token']) return render_refresh_error_bad_credentials if @resource.blank? return render_invalid_error_token_expired if @resource.refresh_token_expired_at < Time.zone.now client = request.headers['client'] @resource.tokens.delete(client) @resource.update!(refresh_token: nil) @token = @resource.create_token @resource.regenerate_refresh_token @resource.save! sign_in(:user, @resource, store: false, bypass: false) render_create_success end ``` @token = @resource.create_token こちらでstaff_mybearsのtokenを作成している場合はこのcreate_tokenのメソッドはどこに定義されているのか? 同じく, sifn_inはどのように判断しているのかも分かっていない。 ``` sign_in(:user, @resource, store: false, bypass: false) render_create_success ``` ## 新しく作るAIbotについて 方針としては、 すでに実装されている認証基盤とセッションに乗っかるつもりです。 具体的には、 staff_my_bearsテーブルに今回使用するAI用のアクセストークンを乗せてクライアント側に投げるつもりです。 セッションの部分はsession_idをログイン毎に設けて管理するつもりです。 #### まとめ 認証の全体的なところがわからなく、的外れなような気もするのですが、全体的な仕様と該当のソースコードについて教えていただきたいです。 ログイン状態の保持、(セッション)が記載されている場所がわからないのですが、どこが該当になりますか?