小明: 嘿,小华,我最近在我们学校的项目中负责开发一个统一身份认证系统。你能给我一些建议吗?
小华: 当然可以。首先,我们需要确定采用哪种认证机制,比如基于OAuth或SAML的单点登录系统。
小明: 我们打算使用OAuth 2.0,因为它比较灵活且易于集成。
小华: 那么,我们可以从定义用户数据库开始。假设我们使用MySQL数据库来存储用户信息。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE
);
小华: 接下来是创建一个简单的用户注册和登录接口。我们可以使用Node.js和Express框架。
const express = require('express');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const app = express();
app.use(express.json());
// 用户注册
app.post('/register', async (req, res) => {
try {
const { username, password, email } = req.body;
const hashedPassword = await bcrypt.hash(password, 10);
const result = await db.query('INSERT INTO users (username, password_hash, email) VALUES (?, ?, ?)', [username, hashedPassword, email]);
res.status(201).send({ message: 'User registered successfully' });
} catch (error) {
res.status(500).send({ error: 'Failed to register user' });
}
});
// 用户登录
app.post('/login', async (req, res) => {
try {
const { username, password } = req.body;
const [user] = await db.query('SELECT * FROM users WHERE username = ?', [username]);
if (!user || !(await bcrypt.compare(password, user.password_hash))) {
return res.status(401).send({ error: 'Invalid credentials' });
}
const token = jwt.sign({ userId: user.id }, 'secret_key', { expiresIn: '1h' });
res.send({ token });
} catch (error) {
res.status(500).send({ error: 'Failed to login' });
}
});
小华: 这样我们就完成了基本的身份认证功能。接下来需要考虑的是如何实现单点登录。
小明: 是的,这样学生就可以在一个地方登录,访问不同的服务而不需要重复输入用户名和密码。
小华: 没错。我们可以使用OAuth 2.0的授权码流程来实现这一点。这需要一些额外的工作来配置OAuth服务器。
小明: 太好了,我会继续研究这个部分。感谢你的帮助!
小华: 不客气,祝你成功!