Entwicklung eines Miniprogramms zur Implementierung einer einheitlichen Verwaltung von Access_Token

Entwicklung eines Miniprogramms zur Implementierung einer einheitlichen Verwaltung von Access_Token

TOKEN Timer-Aktualisierung

1. Hintergrund

Entwickler, die die API-Funktionen der öffentlichen Plattform verwendet haben, werden mit dem access_token sicherlich vertraut sein. Es ist wie ein Schlüssel, der die Tür Ihres Hauses öffnet. Solange Sie ihn haben, können Sie die meisten API-Funktionen der öffentlichen Plattform nutzen. Daher ist die Verwendung des Zugriffstokens für Entwickler besonders wichtig. Im täglichen Betrieb von API-Schnittstellen stoßen wir häufig auf verschiedene Fragen: Warum ist mein access_token plötzlich ungültig? Warum ist der Zugriffstoken, den ich gerade erhalten habe, nach 10 Minuten abgelaufen? Als Antwort auf diese Fragen bieten wir eine Designlösung für access_token an, die Entwicklern helfen soll, die Verwendung von access_token zu verstehen.

Informationen zum Abrufen des Zugriffstokens finden Sie in der offiziellen Dokumentation der öffentlichen Plattform: auth.getAccessToken, Get Access token

2. Internes Design des access_token

2.1 Aktualität des access_token

Wie wir alle wissen, wird access_token durch App-ID und Appsecret generiert. Die Schritte der Innenarchitektur sind wie folgt:

(1) Der Entwickler verwendet https für die Anforderung: GET https://API.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET und übergibt die Parameter appid und apppsecret.

(2) Das öffentliche Backend der Plattform überprüft, ob die App-ID und der Hash (Appsecret) mit dem Speicher übereinstimmen. Wenn sie übereinstimmen, wird basierend auf dem aktuellen Zeitstempel ein neuer Zugriffstoken generiert.

(3) Wenn ein neuer Zugriffstoken generiert wird, wird der Ablaufzeitstempel des alten Zugriffstokens auf den aktuellen Zeitstempel aktualisiert.

(4) Geben Sie den neuen Zugriffstoken an den Entwickler zurück.

Hier ist ein Diagramm, das den Vorgang des Wechsels zwischen alten und neuen Token veranschaulicht:

Im obigen Diagramm sind einige wichtige Punkte zu beachten:

(1) Die öffentliche Plattformspeicherschicht speichert nur die neuen und alten Zugriffstoken. Dies bedeutet, dass, wenn der Entwickler die Schnittstelle dreimal aufruft, der früheste Zugriffstoken sofort ungültig wird.

(2) Obwohl die Ablaufzeit des alten access_token nach der Anforderung eines neuen access_token auf die aktuelle Zeit aktualisiert wird, wird es nicht sofort ungültig. Informationen zum Prinzip finden Sie unter [2.2 Allmähliches Ablaufen des access_token].

(3) Aus Gründen der Informationssicherheit speichert die öffentliche Plattform das Appsecret nicht im Klartext, sondern nur die App-ID und den Hash-Wert des Appsecret. Daher müssen Entwickler die App-Geheimnisse sorgfältig aufbewahren. Wenn der Verdacht besteht, dass das Appsecret durchgesickert ist, müssen Sie sich rechtzeitig bei mp.weixin.qq.com anmelden, um das Appsecret zurückzusetzen.

2.2 Allmähliches Ablaufen des access_token

Aus [Aktualität des Zugriffstokens] wissen wir, dass, wenn ein Entwickler einen neuen Zugriffstoken anfordert, die Ablaufzeit des alten Zugriffstokens auf die aktuelle Zeit aktualisiert wird, dieser jedoch nicht sofort ungültig wird, da die öffentliche Plattform [5 Minuten Pufferzeit für den Wechsel zwischen dem neuen und dem alten Zugriffstoken] bereitstellt, weshalb er auch Zugriffstoken genannt wird.

allmähliches Versagen.

Das Umsetzungsprinzip lautet:

  • Da der Ablaufzeitstempel des alten Zugriffstokens aktualisiert wurde, wird der Ablaufzeitstempel während der API-Schnittstellenanforderung nach dem Entsperren des Zugriffstokens um 5 Minuten erhöht und dann mit der aktuellen Gerätezeit verglichen. Wenn er die aktuelle Gerätezeit überschreitet, wird er als ungültig betrachtet.
  • Die Geräte auf der öffentlichen Plattform halten die Uhren synchronisiert, es kann jedoch dennoch ein Zeitunterschied von 1–2 Minuten zwischen den Geräten bestehen. Daher handelt es sich bei [5 Minuten] nicht um einen absoluten Zeitwert. Wenn Entwickler ein neues Zugriffstoken erhalten, sollten sie so schnell wie möglich zum neuen Zugriffstoken wechseln.

Im obigen Diagramm sind einige wichtige Punkte zu beachten:

(1) Aufgrund von Unterschieden bei der Gerätezeitsynchronisierung können Entwickler auf Situationen stoßen, in denen einige Anfragen an die API-Schnittstelle mit dem alten Zugriffstoken erfolgreich sind, während andere fehlschlagen. Es wird Entwicklern empfohlen, den neuen Zugriffstoken so bald wie möglich nach Erhalt zu verwenden.

(2) Durch das Verständnis der beiden Diagramme wird klar, dass der Zugriffstoken für Entwickler eine sehr wichtige Schnittstelle ist, die nicht beliebig angepasst werden kann. Es wird empfohlen, dass Entwickler den Zugriffstoken einheitlich verwalten, um Mehrfachanforderungen zu vermeiden, die dazu führen können, dass der Zugriffstoken ungültig wird.

3. Einheitliche Verwaltung von access_token

Senden Sie die Aktualisierung von access_token an den Timer-Trigger, um alle Schnittstellenaufrufe abzuschließen, die access_token verwenden. Übergeben Sie access_token nicht und lassen Sie das Backend es aus der Datenbank lesen

Das folgende Beispiel zeigt die einheitliche Verwaltung des access_token -Codes auf der Seite der Miniprogramm-Cloud-Funktion.

index.js fordert access_token an und aktualisiert ihn

Bei anderen Terminals müssen Sie APPID eingeben

const cloud = erfordern('wx-server-sdk')
cloud.init({
  Umgebung: cloud.DYNAMIC_CURRENT_ENV
})
const Zeitutil = erforderlich('./Zeitutil');
// Konfigurationselemente, die geändert werden müssen const APPSECRET = ''
const axios = erfordern('axios');
const db = cloud.database();
// Regelmäßig aktualisieren und Konfigurationsinformationen abrufen const CONFIG = 'cloud-token';
// Holen Sie sich das Token
const URL = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}'
Funktion getAccessToken(APPID,APPSECRET){
  lassen Sie url = URL;
  url = url.ersetzen('{APPID}',APPID)
  url = url.ersetzen('{APPSECRET}',APPSECRET)
  returniere neues Promise(Funktion(auflösen,ablehnen){
    axios.get(url).then(Funktion (Antwort) {
      console.log(Antwort);
      Lösung (Antwort)
    })
    .catch(Funktion (Fehler) {
      konsole.log(Fehler);
      ablehnen(Fehler)
    });
  })
}
// Cloud-Funktionseintrag Funktion exports.main = async (Ereignis, Kontext) => {
  const wxContext = cloud.getWXContext()
  // Automatisches Abrufen der aktuellen Anwendungs-APPID
  var APPID = wxContext.APPID;
  returniere neues Promise(Funktion(auflösen,ablehnen){
    getAccessToken(APPID,APPSECRET).dann(async res=>{
      Konsole.log(res)
      Lassen Sie access_token = res.data.access_token;
      lass ans = warte auf db.collection(CONFIG).doc('access_token').set({
        Daten:{
          Wert: Zugriffstoken,
          _updateTime:timeutil.TimeCode()
        }
      })
      Entschlossenheit(en)
    })
  }) 
}

config.json Timer-Trigger

Wird stündlich ausgelöst

{
  "Auslöser": [
    {
      "Name": "meinTrigger",
      "Typ": "Timer",
      "Konfiguration": "0 0 * * * * *"
    }
  ]
}

timeutil.js Zeittool-Klasse

Funktion TimeCode() {
  var date = neues Datum();
  var Jahr = Datum.getFullYear()
  var Monat = date.getMonth() + 1
  var Tag = Datum.getDate()

  var Stunde = Datum.getHours()
  var minute = date.getMinutes()
  var Sekunde = date.getSeconds()

  return [Jahr, Monat, Tag].map(formatNumber).join('-') + ' ' + [Stunde, Minute, Sekunde].map(formatNumber).join(':')
}
//Datum abrufen Funktion _formatTime(time) {
  var Datum = Zeit.getFullYear() + 'Jahr' + Zeit.getMonth() + 'Monat' + Zeit.getDate() + 'Tag'
  var ftime = time.getHours() + 'Stunden' + time.getMinutes() + 'Minuten' + time.getSeconds() + 'Sekunden'
  Rückflugdatum + ftime;
}
Funktion TimeCodeYmd(){
  var date = neues Datum();
  var Jahr = Datum.getFullYear()
  var Monat = date.getMonth() + 1
  var Tag = Datum.getDate()

  return [Jahr, Monat, Tag].map(formatNumber).join('-');
}
Funktion FormatNummer(n) {
  n = n.toString()
  gibt n[1] zurück?
}
module.exports={
  Zeitcode,
  ZeitcodeYmd
}

Wenn access_token in anderen Cloud-Funktionen verwendet wird, wird es durch Abfragen der Datenbank erhalten und die beiden sind über die Datenbank logisch gekoppelt.

Verwendung der Access_token-Abfrage

const TOKEN = "Cloud-Token";
//Zugriffstoken abrufen 
  versuchen {
    lass tres = warte auf db.collection(TOKEN).doc('access_token').get();
    Zugriffstoken = tres.data.value;
    console.log(Zugriffstoken)
  } Fehler abfangen {
    console.log('--Kein Token-Datensatz--')
    zurückkehren {
      Fehlercode: -1,
      errMsg:'Es gibt keine TOKEN-Informationen in der Datenbank'
    }
  }

Referenzdokumentation

【1】Internes Design des Zugriffstokens für die öffentliche Plattform/Miniprogramm-Server-API | WeChat Open Community (qq.com)

【2】auth.getAccessToken | WeChat Open-Dokumentation (qq.com)

【3】Zusammenfassung der Fähigkeiten zur Entwicklung von WeChat-Miniprogrammen (Teil 3) - Zeiteffiziente Datenaktualisierung und -speicherung bei der Cloud-Entwicklung (Access_Token usw.) - Kindear - cnblogs.com

Damit ist dieser Artikel über die Implementierung einer einheitlichen Verwaltung von Zugriffstokens bei der Entwicklung kleiner Programme abgeschlossen. Weitere Informationen zur einheitlichen Verwaltung von Zugriffstokens bei kleinen Programmen finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • So handhaben Sie den Token-Ablauf in WeChat-Miniprogrammen
  • Informationen zum Problem der automatischen Aktualisierung des Crawler-Tokens des WeChat Mini-Programms
  • Anleitung zum Anmelden beim WeChat Mini-Programm und zum Austauschen von Token
  • Detaillierte Erklärung der WeChat-Applet-URL und Token-Einstellungen
  • Miniprogramm zur Implementierung der Token-Generierung und -Verifizierung

<<:  Schritte zum Installieren von Superset unter dem Win10-System

>>:  Tiefgreifendes Verständnis von globalen Sperren und Tabellensperren in MySQL

Artikel empfehlen

Docker-Installationsschritte für Redmine

Laden Sie das Image herunter (optionaler Schritt,...

Detaillierte Installation und Verwendung von SSH in der Ubuntu-Umgebung

SSH steht für Secure Shell, ein sicheres Übertrag...

Rückgängigmachen der Anmeldung in MySQL

Konzepteinführung: Wir wissen, dass das Redo-Log ...

Mehrere Möglichkeiten zum Festlegen der Ablaufzeit von localStorage

Inhaltsverzeichnis Problembeschreibung 1. Basislö...

CSS erstellt Tippboxen, Bubble-Boxen und Dreiecke

Manchmal benötigen unsere Seiten Eingabeaufforder...

Detaillierte Erklärung der Methoden und Eigenschaften von Vue

Vue-Methoden und -Eigenschaften 1. Methoden Verwe...

So verwenden Sie Zen-Codierung in Dreamweaver

Nachdem ich meinen letzten Artikel „Zen Coding: Ei...

Vue + SSM realisiert den Vorschaueffekt beim Hochladen von Bildern

Die aktuelle Anforderung lautet: Es gibt eine Sch...

Detaillierte Erklärung des JS-Browser-Ereignismodells

Inhaltsverzeichnis Was ist ein Ereignis Ein einfa...

Grundlegendes zur JavaScript-Prototypenkette

Inhaltsverzeichnis 1. Verständnis der Gleichheits...

Informationen zum Textumbruchproblem bei IE-Labels (LI)

Ich habe lange damit gekämpft und nach einiger Suc...