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 スローログ実践のまとめ

推薦する

Linuxはシェルスクリプトを使用して履歴ログファイルを定期的に削除します

1. ツールディレクトリのファイル構造 [root@www tools]# ツリーツール/ ツール/...

ウェブページ作成のヒントのまとめ

序文この記事は主に、日常の Web ページ制作で遭遇する問題解決スキルの一部をまとめ、皆さんの参考と...

Linux スケジュールタスクの関連操作の概要

皆様の参考と操作を容易にするために、様々な主要ウェブサイトを検索し、関連するスケジュールされたタスク...

favicon.ico についていくつか注意点があります (ルートディレクトリに置くのがベストです)

任意のウェブページを開きます。例: http://www.baidu.com/ ブラウザのタブのヘッ...

Docker rocketmq デプロイメントの実装例

目次準備展開プロセスRocketMQ の初体験関連する質問ヘルプドキュメント私は最近 RocketM...

MySQLインデックスが失敗するいくつかの状況の詳細な分析

1. 先頭のあいまいクエリではインデックスを使用できません (「%XX」や「%XX%」など)コード値...

JavaScript の new 演算子の原理と例の詳細な説明

新しい用途new の機能は、コンストラクターを通じてインスタンス オブジェクトを作成することです。イ...

Dockerコンテナの自動終了を停止する方法の詳細な説明

この記事では、Docker コンテナとフロントエンド プロセスの関係と、コンテナを永続的に実行できる...

iostat を使用して Linux ハードディスクの IO パフォーマンスを表示する方法

TOP 観察: IO 待機に占められる CPU 時間の割合。30% を超えると、IO の負荷が高くな...

JavaScript 文字列の一般的なメソッドの詳細な説明

目次1. キャラクター文法パラメータ索引戻り値2. 連結文法パラメータ文字列2 [, …文字列N]戻...

ReactアプリケーションにおけるDOM DIFFアルゴリズムの詳細な説明

目次序文VirtualDOM とは何ですか? VirtualDOMを使用する理由DOMレンダリングペ...

Mac M1 での Nginx のマルチサイト構成の実装

注: nginxはbrew経由でインストールされますウェブサイトのルートディレクトリ: /opt/h...

Docker 可視化グラフィックツール portainer の詳細な説明

目次1. ポーテナーの紹介2. Portainer アーキテクチャの概要3. Portainerのイ...

Linux環境で環境変数を設定する方法

JDKダウンロードアドレス: http://www.oracle.com/technetwork/j...