Skip to content
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

不定期でサーバーのアクセストークンを利用した traQ API の利用ができなくなる #562

Open
iChemy opened this issue Aug 12, 2024 · 5 comments
Labels
bug Something isn't working

Comments

@iChemy
Copy link
Contributor

iChemy commented Aug 12, 2024

不定期でタイトルの現象が発生し,TraQUserMiddleware などでエラーが返ってしまうためその間全ユーザーがknoQを利用できなくなる.

誰かがsessionを消しログインに成功すれば解消する.

@iChemy
Copy link
Contributor Author

iChemy commented Aug 12, 2024

原因は
var traqAPIConfig = traq.NewConfiguration()
HTTPClient フィールドが NewOauth2APIClient を通して不正なトークンを利用したものに書き換えられてしまうこと.

@iChemy
Copy link
Contributor Author

iChemy commented Aug 12, 2024

func (repo *TraQRepository) GetUser(userID uuid.UUID) (*traq.User, error)
traqAPIConfig を元に traQ の API を叩くが func (repo *TraQRepository) GetUser(userID uuid.UUID) (*traq.User, error) 内で HTTPClient を書き換えることはないため先述のことが起こった後だと 不正な HTTPClient フィールドの traqAPIConfig でtraQ の API を叩きエラーが返ってしまう.

これは (当然) HTTPClient が有効なものに書き換えられない限り続く

@iChemy
Copy link
Contributor Author

iChemy commented Aug 12, 2024

誰かがログインし直すと,その過程で func (repo *TraQRepository) GetUserMe(token *oauth2.Token) (*traq.User, error) が呼ばれ,これは func NewOauth2APIClient(ctx context.Context, token *oauth2.Token) *traq.APIClienttraqAPIConfigHTTPClient フィールドを書き換え,適切なトークンを利用してこれが行われれば有効な traqAPIConfig は有効な HTTPClient フィールドを保持するためエラーがなくなる.

@iChemy
Copy link
Contributor Author

iChemy commented Aug 12, 2024

再現方法例

必要なもの: 2つの異なるブラウザ (ブラウザA, ブラウザBと呼称),bot の traQ へのアクセストークン

  1. あの手この手で ブラウザAに bot ユーザーとしてのsessionを保持さる.
  2. ブラウザBでは普通にtraQユーザーとしてのsessionを保持させる.
  3. func (repo *Repository) LoginUser(query, state, codeVerifier string) (*domain.User, error) を下のように書き換える (1例)
var once = 0

func (repo *Repository) LoginUser(query, state, codeVerifier string) (*domain.User, error) {
	// 省略
	t, err := repo.TraQRepo.GetOAuthToken(query, state, codeVerifier)
	// 省略
	if once == 0 {
		// たまたま不正なトークンに書き換える
		fmt.Println("GetOAuthToken unexpectedly return invalid token")
		t = &oauth2.Token{
			AccessToken: "123456789123456789123456789123456789", // invalid token
		}
		once++
	}
	traQUser, err := repo.TraQRepo.GetUserMe(t)
	// 省略
}
  1. 書き換えた後に docker で開発環境を立ち上げる.このとき,各ブラウザは session を保持したままである必要がある.
  2. ブラウザA, B ともに session があるため,ログインせずに localhost:3000 にアクセスしてknoQ が利用できることを確認する. (このとき,ブラウザAのユーザーがちゃんとbotになっていることを確認すること)
  3. ブラウザB の session を削除しログインを試みる.このとき上述の LoginUser が走り traqAPIConfigHTTPClient フィールドが不正なトークンで書き換えられるのでログインはできないはずである.
  4. ここで無関係なブラウザAで knoQ を利用しようとするとできなくなっていることを確認する.(<- knoQを開いてみたらなんか利用できなくなってる現象を再現できた)
  5. ブラウザBで再びログインを試みる.一回しか不正なトークンに書き換えないため今度は成功するはずである.
  6. ブラウザAでknoQが利用できることを確認する.(<-誰かがログインし直すことでなぜか利用できるようになる現象を再現できた)

@iChemy iChemy added the bug Something isn't working label Aug 12, 2024
@iChemy
Copy link
Contributor Author

iChemy commented Aug 26, 2024

client := oauth2Config.Client(ctx, oauth2Token)

によって作成された *http.Client

req.Header.Set("Authorization", "Bearer ANOTHER_TOKEN")

なる *http.Requestreq で リクエストを送った場合, Authorization ヘッダーには oauth2Token の方が設定されていることが確認できたので
HTTPClient フィールドを書き換えてるのが悪いという考えであってそう.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant