要实现AdonisJS Socket.IO JWT身份验证,可以按照以下步骤进行操作:
安装AdonisJS和Socket.IO:
npm install --global @adonisjs/cli
adonis new myapp
cd myapp
adonis install @adonisjs/socket.io
安装jsonwebtoken和jsonwebtoken-promisified库:
npm install jsonwebtoken jsonwebtoken-promisified
创建一个自定义的Socket.IO认证提供者:
adonis make:provider SocketIOAuth
在providers/SocketIOAuthProvider.js
文件中,编写以下代码:
'use strict'
const { ServiceProvider } = require('@adonisjs/fold')
const { promisify } = require('jsonwebtoken-promisified')
class SocketIOAuthProvider extends ServiceProvider {
register() {
// 注册Socket.IO认证提供者
this.app.singleton('Adonis/Src/SocketIOAuth', () => {
const Config = this.app.use('Adonis/Src/Config')
const Encryption = this.app.use('Adonis/Src/Encryption')
const socketAuthConfig = Config.get('socketAuth')
const jwtSecret = Config.get('app.appKey')
return new (require('.'))(Encryption, promisify, jwtSecret, socketAuthConfig)
})
}
boot() {
// 在应用启动时调用Socket.IO认证提供者
const Socket = this.app.use('Adonis/Addons/Socket')
const SocketIOAuth = this.app.use('Adonis/Src/SocketIOAuth')
Socket.middleware(async (socket, next) => {
try {
await SocketIOAuth.authenticate(socket)
await next()
} catch (error) {
socket.disconnect()
}
})
}
}
module.exports = SocketIOAuthProvider
在start/socket.js
文件中,添加以下代码来使用自定义的Socket.IO认证提供者:
const providers = [
// ...
'@adonisjs/websocket/providers/WsProvider',
'App/Providers/SocketIOAuthProvider',
]
在config/app.js
文件中,添加以下配置:
module.exports = {
// ...
appKey: Env.get('APP_KEY'),
socketAuth: {
expiresIn: '1d',
},
}
创建一个JWT身份验证类:
adonis make:middleware JWTAuth
在app/Middleware/JWTAuth.js
文件中,编写以下代码:
'use strict'
const jwt = require('jsonwebtoken')
class JWTAuth {
async handle({ socket, request }, next) {
const token = request.headers().authorization
if (!token) {
throw new Error('No token provided')
}
try {
const decoded = await jwt.verify(token, 'your-jwt-secret')
socket.user = decoded.user
} catch (error) {
throw new Error('Invalid token')
}
await next()
}
}
module.exports = JWTAuth
在start/kernel.js
文件中,将自定义的JWT身份验证中间件添加到全局中间件列表中:
const globalMiddleware = [
// ...
'App/Middleware/JWTAuth',
]
在Socket.IO事件中使用身份验证:
const Socket = use('Adonis/Addons/Socket')
Socket.on('someEvent', async ({ socket }) => {
const user = socket.user // 获取已经验证的用户
// 在这里执行你的业务逻辑
})
这样就实现了AdonisJS Socket.IO JWT身份验证。可以通过创建一个JWT令牌并将其添加到Socket.IO连接的请求头中来进行身份验证。然后,在Socket.IO事件处理程序中,可以轻松地获取已验证的用户信息,并执行相应的业务逻辑。
下一篇:AdonisJs 图片上传