スーパートークス


独自の認証コードを書くべきですか?私はいくつかの新しいアプリケーションを構築する準備ができて、この質問は私の心に最初です.私は一般的にサードパーティにアプリの最も重要な部分を渡すのアイデアに非常に不快感を感じる.どのようなサードパーティは、GoogleやFacebookであり、彼らは彼らが現在の道徳的な当局であると思うように見えるので、彼らはあなたを検閲する必要があることを決定?そのリスクの他に、ここではカスタム認証の実装について考えてみましょう.
長所
  • フルコントロール
  • ノーベンダーLockin
  • 低コスト
  • 短所
    を維持するために、
  • 以上のコード
    異なるデータベース
  • のユーザー・レコード
    未知の脆弱性の高い危険性
    私は最近ビデオからSupertokensについて聞きました.オープンソースであり、Postgres上で動作していて、サードパーティ認証を使用することに関連したいくつかの問題を解消することができるかどうかを確認したかった.
    私がそれを試してみる最速の方法は、カスタムJWTSの代わりにAutoTestのスーパートークンを使用するために私のHasura Startersコードをリファクタにすることでした.
    私の既存のコードベースは、一般的な認証ワークフローを提供するために、いくつかのcustom actionsを使用します.
  • レジスター
  • のログイン
  • changepassword
  • 破壊ユーザー
  • resetpassword
  • SuperTokensを提供しているUIコンポーネントを使用する代わりに、私は私のカスタムコードの代わりにスーパートークンと相互作用するために各々の行動を書き直すことを望みました.すべてはきれいになった!例えば、私の手作りのユーザ登録コードはすべてこの1行になりました.
    const signup = await EmailPassword.signUp(email, password)
    
    私の他のカスタムアクションのすべても簡単に変換されました.わずかに醜いだけのコードは、JWTがログインアクションから戻るようにするプロセスです(based on this code)
    await Session.createNewSession(res, user.id)
    let sessionHandles = await Session.getAllSessionHandlesForUser(user.id)
    let token = ''
    
    for (const handle of sessionHandles) {
      const sessionInfo = await Session.getSessionInformation(handle)
      const jwt = sessionInfo.accessTokenPayload["jwt"]
      if (jwt) {
        token = jwt
      }
    }
    
    ユーザーがセッションのトンを持っている場合、ここで何が起こるかわからない.CreateNewSessionにも与えられたResponseオブジェクトは、Hasuraのノードへの呼び出しから来て、ユーザーのブラウザからの要求ではありません.レスポンスオブジェクトを必要としなかったCreateNewSessionのバージョンがあるなら、それは素晴らしいでしょう.
    スーパートークンについてのいくつかの良いことは以下の通りです.
  • はメールをカスタマイズする方法を提供します(あるいは単にメール確認とパスワードリセットトークンを自分で生成します).
  • は私のアプリと同じPostgresインスタンスにデータを格納することができました.
  • Dockerイメージは使いやすくカスタマイズされました.
  • プロジェクトは、Githubで活発です.しかし、私が私の今後のプロジェクトでsupertokensを使うならば、私はまだ100 %確かでありません.長期的な負債になるかもしれないと心配していることがいくつかありました.
  • データベーススキーマは断片化され、使用するのは難しいでしょう.
  • ドキュメントをナビゲートすることは困難です.
  • 既存のJWTのパスワード変更を有効にするのは難しいでしょう.
  • SuperTokensが維持されていない場合、切替経路はどうなるか?
  • ユーザーが別々のスキーマ(あるいはデータベース)にいるときに、どのようにマルチテナントロールをhasura内で実装することができますか.