Maison >interface Web >js tutoriel >Comment Electron implémente-t-il la connexion rapide QQ ?
Le contenu de cet article explique comment Electron peut réaliser une connexion rapide QQ ? Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.
Je ne voulais pas écrire cette fonction avant, mais le client devait se connecter via QQ. Je n'avais pas d'autre choix que de l'écrire, et j'ai d'ailleurs écrit un article ! >Il y a deux questions avant d'écrire :
1 : Ouvrez la page d'autorisation qq et cliquez sur le lien sur la page pour ouvrir une autre page.....
2 : Il est difficile de juger si l'autorisation est réussie ! ou pas
C'est parti ! lisez le document !!!
Placez le bouton de connexion QQ
. Problème résolu
<template> <div> <button @click="qqLogin">qq登录</button> </div> </template> <script> export default { name: "home", mounted() { this.$electron.ipcRenderer.on('reply', (e, data) => { console.log(data) let httpCode = data.request_code[0]; if (httpCode === '1') { alert(data.token[0]) } }) }, methods: { qqLogin() { //请求服务器获取授权页面和参数 this.$http.get('xxxxx') .then((result) => { if (result.data.status === 1) { this.$electron.ipcRenderer.send('qqLogin', {url: result.data.data}); } }) .catch() }, } } </script>
Cliquer sur un lien ouvrira une nouvelle fenêtre
Résoudre le problème d'ouverture de la page d'autorisation QQ et cliquer sur un lien sur la page ouvrira une autre fenêtre. L'événement window de webContents organise l'événement par défaut pour appeler Shell et l'ouvrir avec le navigateur par défaut Il est difficile de juger si l'autorisation est réussie ou nonloginWindow.webContents.on('new-window', (event, url) => { event.preventDefault(); shell.openExternal(url); });
à ceci Après avoir posé la question, j'ai pensé à un mot, qui est Réponse et code, puis je l'ai recherché. Le résultat a été trouvé dans l'événement did-get-redirect-request Mais nous pouvons. Nous devons cliquer sur Autoriser avant de l'utiliser. Il
explication de l'événement de navigation :
loginWindow.webContents.on('will-navigate', (e, url,) => { content.on('did-get-response-details', (e, status, url, originalURL, httpResponseCode, requestMethod, referrer, header) => { if (httpResponseCode === 200) { event.sender.send('reply', header); // loginWindow.close(); } }) });Cet événement ne sera pas émis lors de l'utilisation de l'API (telle que webContents.loadURL et webContents.back) pour lancer la navigation par programme.
Cela ne se produira pas non plus lorsque vous sauterez dans la page, par exemple en cliquant sur le lien d'ancrage ou en mettant à jour window.location.hash. Utilisez l'événement did-navigate-in-page pour atteindre l'objectif
did-get. -explication de l'événement réponse-détails :
Lorsque les détails sur la ressource demandée sont disponibles, les événements sont émis le moment venu, le statut identifie le lien de socket pour télécharger les ressources.
Après avoir obtenu ces deux éléments, nous pouvons écrire du code. !
Après avoir cliqué sur Autoriser, la page d'autorisation passera à un rappel sur notre serveur. L'adresse y effectue une opération, comme l'obtention du jeton utilisateur ! Ensuite, le jeton généré est renvoyé au client !
Mais veuillez noter que les données renvoyées par le serveur ne peuvent pas être analysées par le client. Vous pouvez utiliser : findInPage pour interroger le contenu renvoyé !
Mais je ne l'ai pas fait
Parce que le did-get- L'événement de détails de réponse renvoyé :
status, newURL, originalURL, httpResponseCode, requestMethod, referrer, headers huit paramètres
Les données approximatives sont comme ceci :
Parmi les paramètres ci-dessus, le jeton msg request_code est Les paramètres personnalisés sont générés par le code du serveur
access-control-allow-credentials:["true"] access-control-allow-headers:["token,Origin, X-Requested-With, Content-Type, Accept"] access-control-allow-methods:["POST,GET,DELETE,PUT"] cache-control:["no-store, no-cache, must-revalidate"] connection:["Keep-Alive"] content-type:["application/json; charset=utf-8"] date:["Sun, 21 Oct 2018 14:02:20 GMT"] expires:["Thu, 19 Nov 1981 08:52:00 GMT"] keep-alive:["timeout=5, max=100"] request_code:["1"] msg:["登录成功"] token:["xxxxxxxx"] pragma:["no-cache"] server:["Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9"] set-cookie:["PHPSESSID=6b0esq5jd8vloess2c96ove86s; path=/; HttpOnly"] transfer-encoding:["chunked"] x-powered-by:["PHP/7.2.1"]C'est facile à faire ! récupérez-les ! Le processus de rendu récupère le jeton dans l'en-tête et obtient les informations utilisateur en fonction du jeton !!
Code du processus principal :
Remarque :
import {ipcMain, BrowserWindow, shell} from 'electron' ipcMain.on('qqLogin', (event, data) => { const loginWindow = new BrowserWindow({ width: 750, height: 450, resizable: false, minimizable: false, maximizable: false, webPreferences: { devTools: false, } }); loginWindow.setMenu(null); loginWindow.loadURL(data.url); loginWindow.webContents.on('new-window', (event, url) => { event.preventDefault(); shell.openExternal(url); }); const content = loginWindow.webContents; content.on('will-navigate', (e, status, url,) => { content.on('did-get-response-details', (e, status, url, originalURL, httpResponseCode, requestMethod, referrer, header) => { if (httpResponseCode === 200) { event.sender.send('reply', header); loginWindow.close(); } }) }); });L'en-tête renvoyé contient un tableau. Cette méthode d'écriture est vraiment de la triche. De plus, je dois écrire un header.token[0]. Je n'aime pas cette façon d'écrire mais je n'y arrive pas
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!