Prenez l'habitude d'écrire ensemble ! C'est le 20ème jour de ma participation au "Nuggets Daily New Plan · April Update Challenge", cliquez pour voir les détails de l'événement .
Authentification
-
Authentification (authentification), également appelée "authentification", "authentification"
Par certains moyens, la confirmation de l'identité de l'utilisateur est complétée. L'authentification de l'identité peut être vue partout dans la vie quotidienne, comme la vérification des billets de train à grande vitesse, le déverrouillage du mot de passe du téléphone portable, etc. Dans le développement Web, la connexion par code de vérification du téléphone portable, la connexion par mot de passe par e-mail, etc.
-
Objet de l'authentification
Pour confirmer l'authenticité de l'utilisateur actuel. Dans le développement de projets Internet, comment authentifier les identités des utilisateurs est un problème qui mérite d'être discuté en profondeur. Par exemple, comment pouvons-nous nous assurer que le site Web ou le client n'affichera pas par erreur les informations de l'utilisateur A sur l'utilisateur B ?
-
Authentification dans différents modes de développement
Pour les deux modes de développement de rendu côté serveur et de séparation front-end et back-end, il existe différents schémas d'authentification.
- Il est recommandé d'utiliser le mécanisme d'authentification de session pour le rendu côté serveur
- Il est recommandé d'utiliser le mécanisme d'authentification JWT pour la séparation front-end et back-end
mécanisme d'authentification de session
Apatridie du protocole HTTP
L'apatridie du protocole HTTP signifie que chaque requête HTTP du client est indépendante, qu'il n'y a pas de relation directe entre plusieurs requêtes consécutives et que le serveur ne conservera pas activement l'état de chaque requête HTTP.
Par exemple : le caissier peut-il se rappeler si le client actuel est un membre VIP ?
Dépassez les limites du HTTP sans état
Pour les supermarchés, afin de confirmer facilement si l'utilisateur est un VIP, le supermarché émet une carte de membre pour chaque utilisateur VIP, et l'utilisateur n'a qu'à présenter la carte VIP avant le règlement pour profiter de la réduction d'adhésion
Pour le client et le serveur, l'identité du client peut également être marquée par un identifiant tel qu'une carte de membre. Par exemple, si le client 1 se connecte avec succès, le serveur renverra une identité au client 1, de sorte que le client portera cette identité dans les requêtes suivantes, et le serveur pourra déterminer que l'utilisateur s'est connecté lorsqu'il recevra cette identité. En développement web, cette identité s'appelleCookie
Que sont les cookies
-
La notion de cookies
Cookie 是存储在用户浏览器中的一端不超过 4kb 的字符串。它由一个名称(Name)、一个值(Value)和其他几个用于控制 Cookie 有效期、安全性、适用范围的可选属性组成
-
Cookie 的特性
- 域名独立。不同域名下的 Cookie 各自独立
- 自动发送。每当客户端发起请求时,会自动把当前域名下所有未过期的 Cookie 一同发送到服务器
- 过期时限。每个 Cookie 都有有效期
- 4kb限制。Cookie 不可以超过 4kb
Cookie 在身份认证中的作用
客户端第一次请求服务器的时候,服务器通过响应头的形式,向客户端发送一个身份认证的 Cookie,客户端会自动将 Cookie 保存在浏览器中。随后,当客户端浏览器每次请求服务器的时候,浏览器会自动将身份认证相关的 Cookie 通过请求头的形式发送给服务器,服务器即可验明客户端的身份
Cookie 不具有安全性
由于 Cookie 是存储在浏览器中的,而且浏览器也提供了读写 Cookie 的 API,因此,Cookie 很容易被伪造,不具有安全性,因此不建议服务器将重要的隐私数据通过 Cookie 的形式发送给浏览器
提高身份认证的安全性
为了防止客户端伪造会员卡,收银员在拿到客户出示的会员卡之后,可以在收银机上进行刷卡认证,只有收银机确认存在的会员卡,才能被正常使用。这种 “会员卡 + 刷卡认证” 的设计理念,就是 session 认证机制的精髓
session 的工作原理
在 Express 中使用 session 认证
安装 express-session 中间件
在 Express 项目中,只需要安装 express-session 中间件,即可在项目中使用 session 认证
npm install express-session
复制代码
配置 express-session 中间件
express-session 中间件安装成功后,需要通过 app.user()
来注册 session 中间件
// 1、导入 session 中间件
const session = require('express-session')
// 2、配置 session 中间件
app.use(
session({
// secret 属性的值可以为任意字符串
secret: 'studyNode',
// 固定写法
resave: false,
// 固定写法
saveUninitialized: true
})
)
复制代码
向 session 中存数据
Une fois le middleware de session express correctement configuré, vous pouvez accéder à l'objet de session et l'utiliser req.session
pour stocker les informations utilisateur clés.
app.post('/api/login', (req, res) => {
// 判断用户提交的登录信息是否正确
if (req.body.username !== 'admin' || req.body.password !== '000000') {
return res.send({ status: 1, msg: '登录失败' })
}
req.session.user = req.body //将用户信息存储到 session 中
req.session.islogin = true //将用户登录状态存到 session 中
res.send({ status: 0, msg: '登录成功' })
})
复制代码
Obtenir les données de la session
Obtenir les données précédemment stockées de l' req.session
objet
// 获取用户姓名的接口
app.get('/api/username', (req, res) => {
// 请从 Session 中获取用户的名称,响应给客户端
//判断用户是否登录
if(req.session.islogin){
return res.send({
status: 1,
meassage: 'fail'
})
res.send({
status: 0,
msg:'success',
username:req.session.user.username
})
})
复制代码
séance claire
Appelez la req.session.destory()
fonction pour effacer les informations de session enregistrées par le serveur
app.post('/api/logout', (req, res) => {
// 清空当前用户端对应的 Session 信息
req.session.destroy()
req.send({
status:0,
msg:'退出登录成功'
})
})
复制代码