在移动应用开发过程中,App的接口调用是必不可少的,而为每一个接口都设置单独的用户名和密码是很麻烦的。因此,使用token(令牌)来管理App接口调用会更加方便。下面就详细介绍一下令牌的原理及开发。
一、令牌的基本原理
令牌是在服务端生成的一个字符串,通过这个字符串来保证客户端和服务端之间的安全通信。当有人请求服务器数据时,如果有权限,就会生成一个令牌;下次请求时,只要携带上这个令牌,且该令牌没有过期或被注销,就会直接返回该用户的数据,这样可以减轻服务端的压力,同时也减少了网络请求的次数。
二、令牌的主要特点
1. 令牌是服务端生成,客户端存储;
2. 令牌可以设置有效期,到期后需要重新获取;
3. 令牌只需要在请求头中带上,即可实现认证和权限控制;
4. 令牌只在一次请求中生效,不能重复使用。
三、开发令牌代码实现
在实现令牌之前,需要先定义接口和服务端实现。以Node.js为例,下面是一个简单的实现过程。
1. 检查登录信息
在客户端发送请求时,先检查是否有登录信息。如果没有,则要求用户输入用户名和密码,然后将输入信息发送到服务端进行验证。服务端验证登录信息的代码如下:
```javascript
const bcrypt = require('bcrypt')
const jwt = require('jsonwebtoken')
const checkLogin = async (req, res) => {
const {username, password} = req.body
// 先判断参数是否为空
if (!username || !password) {
// 参数为空,返回错误信息
return res.json({msg: '参数不能为空'})
} else {
// 参数不为空,查询数据库中该用户的信息
const user = await User.findOne({username})
if (!user) {
return res.json({msg: '该用户不存在'})
} else {
// 判断密码是否正确
const isMatch = await bcrypt.compare(password, user.password)
if (isMatch) {
// 密码正确,生成令牌
const token = jwt.sign({_id: user._id}, 'secret', {expiresIn: '1d'})
return res.json({
msg: '登录成功',
token
})
} else {
// 密码错误,返回错误信息
return res.json({msg: '密码错误'})
}
}
}
}
module.exports = checkLogin
```
2. 生成令牌
用户登录成功后,通过`jsonwebtoken`模块生成令牌。其中,`_id`是用户在数据库中的唯一标识符,`secret`是用于生成令牌的密钥,`expiresIn`表示令牌有效期,这里设置为1天。服务端代码如下:
```javascript
const jwt = require('jsonwebtoken')
const generateToken = (_id) => {
const token = jwt.sign({_id}, 'secret', {expiresIn: '1d'})
return token
}
module.exports = generateToken
```
3. 检查令牌
为了保障安全性,在每次请求时都要检查令牌是否合法。这里使用`jsonwebtoken`模块的`verify()`方法进行解析和校验。在校验通过后,可以获取到令牌中的用户信息。通过将用户信息保存在req对象中,可以在后续的控制器中使用。服务端代码如下:
```javascript
const jwt = require('jsonwebtoken')
const checkToken = (req, res, next) => {
const token = req.headers.authorization
// 判断令牌是否存在
if (!token) {
return res.sendStatus(401)
} else {
// 验证令牌的方法,解析令牌
jwt.verify(token, 'secret', (err, decoded) => {
if (err) {
// 令牌错误
return res.sendStatus(401)
} else {
// 令牌正确,将用户信息保存在req对象中
req._id = decoded._id
next()
}
})
}
}
module.exports = checkToken
```
4. 应用令牌
在路由中应用令牌,只需要使用`checkToken()`方法即可。服务端代码如下:
```javascript
const express = require('express')
const router = express.Router()
const checkToken = require('../middlewares/checkToken')
const getProducts = require('../controllers/getProducts')
router.get('/', checkToken, getProducts)
module.exports = router
```
以上就是令牌的基本原理及开发方法,通过令牌的使用,可以在保障安全性的前提下,提高移动应用的性能。