uniappの無痛トークンリフレッシュ方法の詳細な説明

uniappの無痛トークンリフレッシュ方法の詳細な説明

フロントエンドがインターフェースを要求すると、バックエンドでインターフェースが定義されます。ステータス コードが 401 の場合、トークンの有効期限が切れており、フロントエンドが新しいトークンを要求する必要があることを意味します。

一般的なプロセスは次のとおりです。

1. ユーザーがログインすると、バックエンドはストレージに保存されているaccessTokenとrefreshTokenの2つのトークンを返します。

データをリクエストする際、リクエストヘッダーはaccessTokenを使用してインターフェースを送信します

2. トークンの有効期限が切れると、インターフェースを通じてバックエンドから新しいトークンを取得し、リクエストパラメータはrefreshTokenになります。

3. 新しいaccessTokenとrefreshTokenを取得したら、以前のStorageに保存されているトークンを置き換えます。

4. 同時に、新しいaccessTokenを使用して401を報告したインターフェースを再度要求し、データを取得し、トークンの更新をスムーズに行う必要があります。

5. バックエンドから返された新しいトークンが使用できない場合は、再度ログインしてログインページにジャンプする必要があります (この手順は柔軟に使用できます。個人的にはルーティングプラグインを使用しています: https://ext.dcloud.net.cn/plugin?id=578)

uni-app プラグインを使用して実装します。

uni-appプラグインマーケットにアクセスして、パッケージ化されたリクエストネットワークリクエストをダウンロードし、ドキュメントに従って独自のプロジェクトに設定してください。

アドレス: https://ext.dcloud.net.cn/plugin?id=159

設定後、vmeitime-httpフォルダ内のindex.jsファイルを変更します。

次に、vmeitime-httpフォルダ内のinterface.jsファイルを変更して401ステータスを公開します。

これを読んでもまだ理解できない場合は、私のソースコードを見てください。2つのプラグインを使用していることに注意してください。それらを注意深く理解して消化し、自分のプロジェクトで検討してください...

'./interface' から http をインポートします
'./config' から設定をインポートします

// リクエスト.js
'vue' から Vue をインポートします
'@/router' から Router をインポートします

//...その他のロジックコード export const execute = (name, data = {}) => {

    //事前リクエストインターセプターを設定する http.interceptor.request = (config) => {
        トークン = uni.getStorageSync('accessToken') とします。
        config.header['x-access-token']を削除します
        if (トークン) {
            config.header['x-access-token'] = トークン
        }
    }
    //リクエスト終了後にインターセプターを設定する http.interceptor.response = async (response) => {
        定数ステータスコード = 応答.ステータスコード;
        ステータスコード === 401 の場合 {
            応答 = doRequest(応答) を待機します
        }
        ステータスコード === 402 の場合 {
            uni.removeStorageSync('accessToken');
            uni.removeStorageSync('refreshToken');
            uni.removeStorageSync('実名');
            ジャンプ = uni.getStorageSync('ジャンプ')
            if (!ジャンプ) {
                タイムアウトを設定する(() => {
                    uni.showModal({
                        タイトル: 「ヒント」
                        内容: 「あなたのアカウントは別の場所からログインされています!」
                        表示キャンセル: false、
                        成功: function(res) {
                            (res.confirm)の場合{
                                ルータ.push({
                                    名前: 'ログイン',
                                    パラメータ: {
                                        'ルーター名': 'ホーム'
                                    }
                                })
                            }
                        },
                    })
                });
                uni.setStorageSync('ジャンプ', 'true')
            }
        }
        ステータスコード == 403 の場合
            ジャンプ = uni.getStorageSync('ジャンプ')
            if (!ジャンプ) {
                タイムアウトを設定する(() => {
                    ルータ.replace({
                        名前: 'ログイン',
                        パラメータ: {
                            'ルーター名': 'ホーム'
                        }
                    })
                },500)
                uni.setStorageSync('ジャンプ', 'true')
            }
        }
        // エラー要求の統一された処理 const code = response.data.code;
        定数メッセージ = 応答.データ.メッセージ;
        レスポンスステータスコード == 200 && コード !== 0 && コード != -1 && コード) {
            uni.showToast({
                タイトル: メッセージ、
                アイコン: "なし",
                期間: 2000
            });
        }
        応答を返します。
    }
    http.request({を返す
        名前: 名前、
        ベースURL: config.base、
        url: config.interface[名前].path,
        メソッド: config.interface[name].method ? config.interface[name].method : 'GET',
        データ型: 'json',
        データ、
    })
}

エクスポートデフォルト{
    実行する
}
    // リフレッシュトークンメソッド async function doRequest(response) {
        const res = 実行を待機します('refresh'、{refreshToken: uni.getStorageSync('refreshToken')})
        定数{
            コード、
            データ
        } = res.データ
        (コード == 0) の場合 {
            uni.setStorageSync('accessToken', data.accessToken)
            uni.setStorageSync('refreshToken', data.refreshToken)
            config = response.config とします。
            config.header['x-access-token'] = data.accessToken
            const resold = 実行を待機(config.name,{ ...config.data
            })
            返品 再販
        } それ以外 {
            uni.removeStorageSync('accessToken');
            uni.removeStorageSync('refreshToken');
            uni.showToast({
                タイトル: 「ログイン期限が切れました。再度ログインしてください。」 '、
                アイコン: "なし",
                成功() {
                    ルータ.push({
                        名前: 'ログイン',
                        パラメータ: {
                            'ルーター名': 'ホーム'
                        }
                    })
                }
            });
        }
    }

以上が、uniappの無痛トークンリフレッシュ方法の詳しい説明です。uniappの無痛トークンリフレッシュ方法の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • uniapp 要素ノードスタイルの動的変更の詳細な説明
  • uniappとvueの違いの詳細な説明
  • uniappのグローバル変数実装の詳細な説明
  • uni-appのスタイルの詳細な説明

<<:  VC6.0をWIN10にインストールすると使用できない問題の解決方法

>>:  MySQL スローログ実践のまとめ

推薦する

HTML で vue-router を使用するサンプル コード

vue と vue-router の紹介 <script src="https://...

Vue 開発者向けの VSCode 拡張機能ベスト 7

適切な VS Code 拡張機能を Visual Studio に追加すると、開発者としての作業がは...

MySQL の基本クイックスタート知識のまとめ (マインドマップ付き)

目次序文1. データベースの基礎知識1. データベースとは何ですか? 2. データベースの分類3. ...

HTML <!--...--> コメントタグの役割の詳細な分析

多くのウェブサイトのソースコードを確認すると、多くのコメントが見つかります。特に、ソース文書にコメン...

Vue3でカルーセルコンポーネントをカプセル化する方法

目的カルーセルコンポーネントをカプセル化して直接使用します。具体的な内容は以下のとおりです。一般的な...

MySQLウィンドウ関数の具体的な使用法

目次1. ウィンドウ関数とは何ですか? 1. ウィンドウをどのように理解しますか? 2. ウィンドウ...

MySQL の if 関数の正しい使い方の詳細な説明

今日私が書こうとしている内容では、プログラムは 7 時間近く実行され、データベースに 1,000 万...

Windows10にMySQL5.6.35データベースを2つインストールする

次のように、Win10 での 2 つの MySQL5.6.35 データベースのインストールを記録しま...

Windows 10 に Apache 2.4.41 をインストールするチュートリアル

1. Apache 2.4.41 のインストールと設定最初のステップは、以下に示すように、https...

Vue プロジェクトで TypeScript クラスを適用する方法

目次1. はじめに2. 使用1. @コンポーネント2. 計算、データ、方法3. @props 4. ...

CSS仕様 BEM CSSとOOCSSサンプルコード詳細説明

序文プロジェクト開発中、各人のコーディング習慣が異なるため、記述された CSS コードは十分に構造化...

HTML で点線の境界線を設定する方法

CSSスタイルとHTMLタグ要素を使用するさまざまな HTML タグに点線の境界線を追加するために、...

Nginx try_files ディレクティブの使用例

Nginx の設定構文は柔軟で、高度に制御可能です。バージョン 0.7 以降では、try_files...