# 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/)

こちらのようなことを全体的に行なっているのではないかと思っているのですが、認識はあってますでしょうか?
## ソースコードから
リフレッシュトークンがある場合にはアクセストークンが存在している認識なのですが、別に管理をしている場所があるということであってるのか?
その場合、具体的には以下がアクセストークンだと思っているのですが、認識あってますか?
```
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をログイン毎に設けて管理するつもりです。
#### まとめ
認証の全体的なところがわからなく、的外れなような気もするのですが、全体的な仕様と該当のソースコードについて教えていただきたいです。
ログイン状態の保持、(セッション)が記載されている場所がわからないのですが、どこが該当になりますか?