``` OpenIDConnect ```完整代码
时间: 2024-08-23 22:00:43 浏览: 81
OpenID Connect (OIDC) 是OAuth 2.0的一个扩展,它为开放身份验证提供了标准化的方法,使得应用程序能够安全地从可信的身份提供商那里获取用户的授权信息。以下是一个基本的Express应用,使用`passport-oidc`库进行OIDC认证的示例代码:
首先,安装所需的依赖:
```
npm install express passport passport-oidc jsonwebtoken bcryptjs @types/passport @types/passport-oidc @types/jsonwebtoken @types/bcryptjs
```
然后,在服务器端设置配置:
```javascript
import express from 'express';
import jwt from 'jsonwebtoken';
import { Strategy as OIDCStrategy } from 'passport-oidc';
import bcrypt from 'bcryptjs';
const app = express();
const PORT = 3000;
const oidcConfig = {
authorization_endpoint: 'https://your-provider.com/authorize',
token_endpoint: 'https://your-provider.com/token',
client_id: 'your-client-id',
client_secret: 'your-client-secret',
userinfo_endpoint: 'https://your-provider.com/userinfo',
redirect_uri: `${process.env.HTTPS === 'true' ? 'https://' : 'http://' + window.location.hostname}:${
process.env.PORT || 3000
}/auth/callback`,
};
app.use(express.json());
// 使用Passport
app.use(passport.initialize());
app.use(passport.session());
// OIDC Strategy
const oauth2Strategy = new OIDCStrategy(oidcConfig, async function(
accessToken,
refreshToken,
profile,
done
) {
try {
// 解析并验证用户信息
const userInfo = await fetchUserFromProvider(profile.idTokenPayload);
// 对密码进行哈希对比(如果需要)
const storedPassword = await getUserPasswordById(userInfo.sub);
const isMatch = await comparePasswords(userInfo.password, storedPassword);
if (!isMatch) {
return done(null, false, { message: 'Invalid password' });
}
// 创建JWT令牌
const payload = { sub: userInfo.sub };
const secret = process.env.JWT_SECRET; // 请替换为实际的密钥
const jwtToken = jwt.sign(payload, secret, { expiresIn: '1h' });
// 登录成功,将token保存到session并返回
req.login(userInfo, () => {
return done(null, userInfo, { token: jwtToken });
});
} catch (error) {
console.error(error);
return done(error);
}
});
passport.use(oauth2Strategy);
// ...其他路由和业务逻辑...
// 示例方法:假设有一个数据库API来查询用户和哈希值
async function getUserPasswordById(userId) {
// 从数据库查询用户的密码哈希
}
// 比较两个密码
async function comparePasswords(passwordToVerify, storedHash) {
const hash = await bcrypt.hash(passwordToVerify, 10); // 使用bcrypt算法
return bcrypt.compareSync(hash, storedHash);
}
// ...其他路由处理,比如注册、注销等
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
```
这个例子中,我们定义了`oauth2Strategy`,并在登录请求的回调中获取用户信息、验证密码并创建JWT令牌。注意,这里只是给出了一个基础的框架,实际应用中可能还需要考虑更多的细节,如错误处理、状态管理、刷新令牌等。
阅读全文