node-openid-client
是一个用于 Node.js 的 OpenID Connect 客户端库。OpenID Connect 是一种基于 OAuth 2.0 的身份验证层,用于验证用户身份并获取用户信息。
原因: 这个错误通常是由于在重定向回调时,客户端无法找到与请求状态匹配的状态值。
解决方法: 确保在发起授权请求时生成一个状态值,并在回调处理时验证这个状态值。
const { Issuer, custom } = require('openid-client');
(async () => {
const issuer = await Issuer.discover('https://your-oidc-provider.com');
const client = new issuer.Client({
client_id: 'your-client-id',
client_secret: 'your-client-secret',
redirect_uris: ['https://your-app.com/callback'],
});
const params = {
scope: 'openid profile',
response_type: 'code',
redirect_uri: 'https://your-app.com/callback',
state: 'random-state-value', // 生成一个随机状态值
};
const authorizationUrl = client.authorizationUrl(params);
console.log('Authorization URL:', authorizationUrl);
// 处理回调
app.get('/callback', async (req, res) => {
const { code, state } = req.query;
if (state !== 'random-state-value') {
return res.status(400).send('Invalid state parameter');
}
try {
const tokenSet = await client.callback('https://your-app.com/callback', { code, state });
console.log('Token Set:', tokenSet);
res.send('Authentication successful');
} catch (err) {
console.error(err);
res.status(500).send('Authentication failed');
}
});
})();
原因: 这个错误通常是由于回调参数与客户端配置的参数不匹配。
解决方法: 确保回调 URL 和重定向 URI 完全匹配,并且所有必需的参数都正确传递。
const { Issuer, custom } = require('openid-client');
(async () => {
const issuer = await Issuer.discover('https://your-oidc-provider.com');
const client = new issuer.Client({
client_id: 'your-client-id',
client_secret: 'your-client-secret',
redirect_uris: ['https://your-app.com/callback'], // 确保回调 URL 完全匹配
});
const params = {
scope: 'openid profile',
response_type: 'code',
redirect_uri: 'https://your-app.com/callback', // 确保重定向 URI 完全匹配
state: 'random-state-value',
};
const authorizationUrl = client.authorizationUrl(params);
console.log('Authorization URL:', authorizationUrl);
// 处理回调
app.get('/callback', async (req, res) => {
const { code, state } = req.query;
if (state !== 'random-state-value') {
return res.status(400).send('Invalid state parameter');
}
try {
const tokenSet = await client.callback('https://your-app.com/callback', { code, state });
console.log('Token Set:', tokenSet);
res.send('Authentication successful');
} catch (err) {
console.error(err);
res.status(500).send('Authentication failed');
}
});
})();
通过以上方法,可以有效解决“未定义的状态”和"callbackParams不匹配"等错误。确保在发起授权请求时生成并验证状态值,并确保回调 URL 和重定向 URI 完全匹配。
领取专属 10元无门槛券
手把手带您无忧上云