下面就来详细讲解“nodejs中的express-jwt的使用解读”的完整攻略。
什么是express-jwt
express-jwt
是一个基于jwt(jsonwebtoken)认证的中间件,用于验证客户端发来的请求是否合法。
安装express-jwt
在终端中运行以下命令来安装express-jwt
:
npm install express-jwt
使用express-jwt
使用express-jwt
中间件可以很容易的进行jwt认证。下面是一个基本的应用程序的示例:
const express = require('express')
const jwt = require('jsonwebtoken')
const expressJwt = require('express-jwt')
const app = express()
app.use(expressJwt({ secret: 'myscrettoken' }).unless({ path: ['/login'] }))
app.get('/login', (req, res) => {
const user = { id: 1 }
const token = jwt.sign(user, 'myscrettoken')
res.send(token)
})
app.get('/protected', (req, res) => {
res.send(req.user)
})
app.listen(3000, () => console.log('Server started on port 3000'))
上述代码中,我们使用了express-jwt
中间件,并将其作为全局的中间件使用,以便对每个发送到服务器的请求都进行认证。我们还指定了myscrettoken
作为key用于jwt认证。
我们可以通过调用unless
方法来将请求路径添加到保护的列表中。在本例中,我们不需要对/login
路径进行jwt认证。
当我们启动应用程序并访问/login
路径时,将会得到一个jwt token。将该token复制到HTTP请求的Authorization
头中,如下所示:
Authorization: Bearer <your_token_here>
当我们访问/protected
路径时,将会验证jwt token是否有效。如果有效,req.user
将会包含解码的jwt token。
另一个示例
下面是另一个示例,使用express-jwt
来限制API只允许受信任的客户端访问:
const express = require('express')
const jwt = require('jsonwebtoken')
const expressJwt = require('express-jwt')
const app = express()
const clients = [
{
id: 'web',
secret: 'web-secret',
redirectUri: '/auth/callback'
},
{
id: 'mobile',
secret: 'mobile-secret',
redirectUri: '/auth/callback'
}
]
const trustedClients = {
'web-secret': 'web',
'mobile-secret': 'mobile'
}
app.use(express.json())
app.get('/auth/:id', (req, res) => {
const client = clients.find(client => client.id === req.params.id)
if (client) {
res.send(`
<form method="post" action="/auth/${client.id}/approve">
<input type="password" name="password" placeholder="Enter password" />
<button type="submit">Approve</button>
</form>
`)
} else {
res.status(404).send('Client not found')
}
})
app.post('/auth/:id/approve', (req, res) => {
const client = clients.find(client => client.id === req.params.id)
if (client) {
if (req.body.password === 'password') {
const token = jwt.sign({ sub: client.id }, client.secret)
res.redirect(`${client.redirectUri}?token=${encodeURIComponent(token)}`)
} else {
res.status(401).send('Invalid password')
}
} else {
res.status(404).send('Client not found')
}
})
app.get('/api', expressJwt({
secret: (req, payload, done) => done(null, trustedClients[payload.clientSecret]),
algorithms: ['HS256'],
issuer: 'https://localhost/auth'
}))
app.get('/api/data', (req, res) => {
res.send('Hello from the trusted client!')
})
app.listen(3000, () => console.log('Server started on port 3000'))
在上面的示例中,express-jwt
中间件被用来实施API保护。 客户端需要先通过进行身份验证才能访问受保护的API。
首先,客户端向/auth/:id
路径发送身份验证请求,其中:id
是客户端的ID。 它将渲染一个表单,用户可以使用密码输入进行身份验证。 如果密码正确,则将生成一个JWT token并将其重定向回客户端。 token包含sub
字段,其中包含客户端的ID。 客户端将使用此token在后续请求中进行身份验证。
/api
和/api/data
是受保护的API路径。/api
路径使用express-jwt
中间件以验证客户端是否已进行身份验证。 当客户端发送JWT token时,express-jwt
会使用客户端提供的secret
key来验证token的有效性。如果token有效,则客户端将可以访问/api/data
路径并得到一条Hello from the trusted client!信息。
这两个示例提供了express-jwt
的不同用法,其中第一个用来实施JWT身份验证以保护资源,而第二个用来实施基于客户端身份验证的API保护。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nodejs中的express-jwt的使用解读 - Python技术站