Access_Tokenの統合管理を実現するミニプログラム開発

Access_Tokenの統合管理を実現するミニプログラム開発

TOKEN タイマーリフレッシュ

1. 背景

パブリックプラットフォームのAPI機能を使用したことがある開発者にとって、access_tokenは間違いなく馴染みのあるものです。それはまるで家のドアを開ける鍵のようなものです。これさえあれば、パブリックプラットフォームのほとんどのAPI機能を使用できます。そのため、開発者にとって、access_token の使い方が特に重要になります。 API インターフェースの日常的な操作では、さまざまな質問に遭遇することがよくあります。なぜ access_token が突然無効になったのか?取得した access_token が 10 分後に期限切れになったのはなぜですか?これらの質問に答えるために、開発者が access_token の使用方法を理解できるように、access_token の設計ソリューションを提供します。

access_tokenを取得するには、パブリックプラットフォームの公式ドキュメントを参照してください: auth.getAccessToken、Get Access token

2. access_tokenの内部設計

2.1 access_tokenの適時性

ご存知のとおり、access_token は appid と appsecret によって生成されます。インテリアデザインの手順は次のとおりです。

(1)開発者はhttpsを使用してGET https://API.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRETをリクエストし、appidとapppsecretのパラメータを渡します。

(2)パブリックプラットフォームバックエンドは、appidとハッシュ(appsecret)がストレージと一致するかどうかを確認します。一致する場合は、現在のタイムスタンプに基づいて新しいaccess_tokenが生成されます。

(3)新しいaccess_tokenが生成されると、古いaccess_tokenの有効期限のタイムスタンプが現在のタイムスタンプに更新されます。

(4)新しいaccess_tokenを開発者に返します。

以下は、古いトークンと新しいトークンを切り替えるプロセスを示す図です。

上の図から注目すべき点がいくつかあります。

(1)パブリックプラットフォームストレージ層には、新旧のaccess_tokenのみが保存されるため、開発者がインターフェースを3回呼び出すと、最も古いaccess_tokenが直ちに無効になります。

(2)新しいアクセストークンを要求した後、古いアクセストークンの有効期限は現在時刻に更新されますが、すぐに無効になるわけではありません。原理については、[2.2 アクセストークンの段階的な有効期限切れ]を参照してください。

(3)情報セキュリティ上の理由から、パブリックプラットフォームはappsecretをプレーンテキストで保存せず、appidとappsecretのハッシュ値のみを保存します。したがって、開発者は appsecret を適切に保持する必要があります。アプリシークレットが漏洩した疑いがある場合は、すぐにmp.weixin.qq.comにログインしてアプリシークレットをリセットする必要があります。

2.2 access_tokenの段階的な有効期限

[access_tokenの適時性]から、開発者が新しいaccess_tokenを要求すると、古いaccess_tokenの有効期限が現在の時間に更新されますが、パブリックプラットフォームが[新しいaccess_tokenと古いaccess_tokenの交代のための5分間のバッファ時間]を提供するため、すぐに無効にならないことがわかります。そのため、access_tokenとも呼ばれます。

徐々に失敗する。

実装の原則は次のとおりです。

  • 古い access_token 有効期限のタイムスタンプが更新されたため、API インターフェース リクエスト中、access_token がロック解除された後、有効期限のタイムスタンプが 5 分増加され、現在のデバイス時間と比較されます。現在のデバイス時間を超えると、無効とみなされます。
  • パブリックプラットフォーム上のデバイスは時計を同期させますが、デバイス間で 1 ~ 2 分の時間差が生じる可能性があるため、[5 分] は絶対的な時間値ではありません。開発者は新しい access_token を取得したら、できるだけ早く新しい access_token に切り替える必要があります。

上の図から注目すべき点がいくつかあります。

(1)デバイスの時間同期の違いにより、開発者は、古い access_token を使用した API インターフェースへのリクエストの一部が成功し、他のリクエストが失敗するという状況に遭遇する可能性があります。開発者は、新しい access_token を入手したらできるだけ早く使用することをお勧めします。

(2)2つの図からわかるように、開発者にとってaccess_tokenはランダムに調整できない非常に重要なインターフェースです。access_tokenが無効になる可能性のある複数のリクエストを回避するために、開発者はaccess_tokenを統一的に管理することをお勧めします。

3. access_tokenの一元管理

access_tokenの更新をタイマートリガーに送信して、 access_tokenを使用するすべてのインターフェース呼び出しを完了します。 access_tokenを渡さず、バックエンドがデータベースから読み取るようにします。

次の例は、ミニプログラムのクラウド関数側でのaccess_tokenコードの統合管理を示しています。

index.js はaccess_tokenを要求し更新します

他の端末の場合はAPPIDを渡す必要があります

const クラウド = require('wx-server-sdk')
クラウド.init({
  環境: cloud.DYNAMIC_CURRENT_ENV
})
定数timeutil = require('./timeutil');
// 変更が必要な構成項目 const APPSECRET = ''
定数 axios = require('axios');
定数db = cloud.database();
// 構成情報を定期的に更新して取得します const CONFIG = 'cloud-token';
// トークンを取得する
定数 URL = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}'
関数 getAccessToken(APPID,APPSECRET){
  url = URL とします。
  url = url.replace('{APPID}',APPID)
  url = url.replace('{APPSECRET}',APPSECRET)
  新しいPromise(function(resolve,reject){を返す
    axios.get(url).then(function (response) {
      console.log(応答);
      解決(応答)
    })
    .catch(関数 (エラー) {
      コンソール.log(エラー);
      拒否(エラー)
    });
  })
}
// クラウド関数エントリ関数 exports.main = async (event, context) => {
  定数 wxContext = cloud.getWXContext()
  // 現在のアプリケーションのAPPIDを自動的に取得する
  var APPID = wxContext.APPID;
  新しいPromise(function(resolve,reject){を返す
    getAccessToken(APPID,APPSECRET).then(async res=>{
      コンソール.log(res)
      access_token を res.data.access_token とします。
      ans = を待機します db.collection(CONFIG).doc('access_token').set({
        データ:{
          値:access_token、
          _updateTime:timeutil.TimeCode()
        }
      })
      解決する
    })
  }) 
}

config.json タイマートリガー

1時間ごとにトリガー

{
  「トリガー」: [
    {
      "名前": "myTrigger",
      "タイプ": "タイマー",
      "設定": "0 0 * * * * *"
    }
  ]
}

timeutil.js 時間ツールクラス

関数TimeCode() {
  var date = 新しい Date();
  var 年 = date.getFullYear()
  var 月 = date.getMonth() + 1
  var 日 = date.getDate()

  var 時間 = date.getHours()
  var 分 = date.getMinutes()
  var 秒 = date.getSeconds()

  [年、月、日].map(formatNumber).join('-') + ' ' + [時、分、秒].map(formatNumber).join(':') を返します。
}
//日付を取得する function _formatTime(time) {
  var date = time.getFullYear() + '年' + time.getMonth() + '月' + time.getDate() + '日'
  var ftime = time.getHours() + '時間' + time.getMinutes() + '分' + time.getSeconds() + '秒'
  日付 + ftime を返します。
}
関数 TimeCodeYmd(){
  var date = 新しい Date();
  var 年 = date.getFullYear()
  var 月 = date.getMonth() + 1
  var 日 = date.getDate()

  [年、月、日]を返します。map(formatNumber).join('-');
}
関数formatNumber(n) {
  n = n.toString()
  n[1] ? n : '0' + n を返す
}
モジュール.エクスポート={
  タイムコード、
  タイムコードYmd
}

access_token他のクラウド関数で使用される場合、データベースを照会することによって取得され、2 つはデータベースを介して論理的に結合されます。

Access_token クエリの使用

const TOKEN = 'クラウドトークン';
//access_token を取得 
  試す {
    tres = db.collection(TOKEN).doc('access_token').get() を待機します。
    access_token = tres.data.value;
    コンソール.log(アクセストークン)
  } キャッチ(エラー){
    console.log('--トークンレコードがありません--')
    戻る {
      エラーコード:-1、
      errMsg:'データベースにトークン情報がありません'
    }
  }

参照ドキュメント

【1】パブリックプラットフォーム/ミニプログラムサーバーAPIのaccess_tokenの内部設計 | WeChatオープンコミュニティ(qq.com)

【2】auth.getAccessToken | WeChat オープンドキュメント (qq.com)

【3】WeChatミニプログラム開発スキルのまとめ(パート3) - クラウド開発時間効率の良いデータ更新と保存(access_tokenなど) - Kindear - cnblogs.com

小規模プログラム開発における access_token の一元管理の実装方法については以上です。小規模プログラムにおける access_token の一元管理の詳細については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • WeChatミニプログラムでトークンの有効期限を処理する方法
  • WeChatミニプログラムクローラートークン自動更新問題について
  • WeChatミニプログラムにログインしてトークンを交換する方法のチュートリアル
  • WeChatアプレットURLとトークン設定の詳細な説明
  • トークン生成と検証を実装するミニプログラム

<<:  Windows10システムにスーパーセットをインストールする手順

>>:  MySQLのグローバルロックとテーブルロックに関する詳細な理解

推薦する

Apache Bench ストレステストツールの実装原理と使用状況分析

1: スループット(1秒あたりのリクエスト数)サーバーの同時処理能力を定量的に表したもので、reqs...

MySQL の指定文字によるマージと分割の例のチュートリアル

序文指定した文字による結合または分割は一般的なシナリオです。MySQL では結合の記述は比較的簡単で...

goaccess を使用して nginx ログを分析する詳細な方法

最近、goaccess を使って nginx ログを分析したいのですが、nginx ログの設定形式が...

MySQL 5.7.18 zip バージョンのインストールと設定方法のグラフィック チュートリアル (win7)

Windows に mysql5.7.18zip バージョンをインストールするには、使用前に解凍し...

シンプルなウェブデザインコンセプトのカラーマッチング

(I)ウェブページのカラーマッチングの基本概念(1)白黒の言葉は永遠のテーマです。誰もそれを悪く言う...

MySql マスタースレーブレプリケーションメカニズムの包括的な分析

目次マスタースレーブレプリケーションメカニズム非同期レプリケーション準同期レプリケーションマスタース...

アニメーション効果のようなVueトランジションの例

目次結果を一目で見るハート効果デジタルスクロールアニメーションアニメーションのように結果を一目で見る...

Chrome プラグイン (拡張機能) 開発ガイド (完全デモ)

目次前面に書かれた序文ChromeプラグインとはChrome プラグイン開発を学ぶことの意義は何です...

Nginx での SSL 証明書のインストールと展開手順の概要

目次問題の説明:インストール手順1. 準備2. サーバーにリモート接続する3. 証明書と秘密鍵ファイ...

Centos7 ベースの Nginx Web サイト サーバーの構築の詳細説明 (仮想 Web ホストの構成を含む)

1. Nginx サービス基盤Nginx (エンジン x) は、パフォーマンスの最適化のために特別...

Dockerコンテナのログ分析

コンテナログを表示するまず、 docker run -it --rm -d -p 80:80 ngi...

MySQL と接続関連のタイムアウトの詳細な概要

MySQL と接続関連のタイムアウト序文:今日、同僚から、データ量が多いときに MySQL データベ...

ローカルでビルドした Docker イメージを Dockerhub に公開する方法

今日は、ローカルの Docker プロジェクト イメージを dockerhub に公開する方法を紹介...

MySqlはページクエリ機能を実装します

まず、ページ分割クエリを使用する理由を明確にする必要があります。データが膨大なため、すべてのデータを...

Windows10のマウスを模倣して境界線を光らせる効果を実現するCSSの詳細解説

最新の Windows 10 アップデートをインストールした後、システム UI の詳細な効果が顕著に...