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

推薦する

MySQL で URL タイムゾーンの罠を回避する方法

序文最近、MySQL 6.0.x 以降の jar を使用する場合、コード URL リンクで serv...

MySQL の general_log ログの知識ポイントの紹介

以下の操作デモンストレーションはすべて MySQL バージョン 5.6.36 に基づいています。仕事...

VirtualBox Centos7 の NAT+ホストオンリーネットワークの落とし穴のまとめ

目次1. 問題の背景2. 仮想マシン ネットワーク カードの接続方法は何ですか? 2.1 NAT 2...

Docker ベースのよく使われる CentOS7 イメージの概要

目次1 Dockerをインストールする2 国内ミラーソースの設定3 中国語環境基本版Centos7イ...

CSS スタイル分類入門(基礎知識)

CSSスタイルの分類1. 内部スタイル ---- インラインスタイルスタイルタグの使用 <ス...

vue+el-element でファイル名に応じてダイアログを動的に作成する実践

目次背景成し遂げる1. カプセル化された /utils/dialogControl.js 2.ダイア...

Vueデータ割り当て問題の解決

私が長い間遭遇してきた問題を要約してみましょう。プロジェクトでは、フロントエンドをレンダリングするた...

Linux の who コマンド例の紹介

誰についてシステムにログインしているユーザーを表示します。 who コマンドを実行すると、現在システ...

MySQL 派生テーブル(Derived Table)の簡単な使用例分析

この記事では、例を使用して、MySQL 派生テーブルの簡単な使用方法を説明します。ご参考までに、詳細...

httpsウェブサイトにリファラーhttpsとhttpジャンプリファラーを送信させる方法

この記事では、HTTP プロトコルのリファラーのメタデータ パラメータの提案について説明します。この...

js はマウスによる画像の切り替えを実装します (タイマーなし)

この記事の例では、マウス切り替え画像を実現するためのjsの具体的なコードを参考までに共有しています。...

データベース管理における 19 の MySQL 最適化方法

MySQL データベースを最適化すると、データベースの冗長性を削減できるだけでなく、データベースの実...

vue cli3は環境ごとにパッケージ化の手順を実装します

cli3 でビルドされた vue プロジェクトは、ゼロ構成ファイルとして知られています。パッケージ化...

JavaScript parseInt() と Number() の違いのケーススタディ

学習目標: parseInt() と Number() という 2 つの関数は、文字列をデータ型に変...

MySQLにおける正規表現の一般的な使用法

MySQL における Regexp の一般的な使用法特定の文字列を含むあいまい一致# コンテンツフィ...