121 lines
4.0 KiB
TypeScript
121 lines
4.0 KiB
TypeScript
import { OIDCProvider } from '../src/provider';
|
||
import type { OIDCProviderConfig } from '../src/types';
|
||
|
||
// 模拟存储适配器
|
||
const mockStorage = {
|
||
async set(key: string, value: any, ttl?: number): Promise<void> {
|
||
console.log(`存储: ${key}`);
|
||
},
|
||
async get(key: string): Promise<any> {
|
||
return null;
|
||
},
|
||
async delete(key: string): Promise<void> {
|
||
console.log(`删除: ${key}`);
|
||
}
|
||
};
|
||
|
||
// 基础配置
|
||
const baseConfig: Omit<OIDCProviderConfig, 'signingKey' | 'signingAlgorithm'> = {
|
||
issuer: 'https://auth.example.com',
|
||
storage: mockStorage,
|
||
findUser: async (userId: string) => ({
|
||
sub: userId,
|
||
username: 'testuser',
|
||
email: 'test@example.com'
|
||
}),
|
||
findClient: async (clientId: string) => ({
|
||
client_id: clientId,
|
||
client_type: 'public' as const,
|
||
redirect_uris: ['http://localhost:3000/callback'],
|
||
grant_types: ['authorization_code'],
|
||
response_types: ['code'],
|
||
scopes: ['openid', 'profile'],
|
||
created_at: new Date(),
|
||
updated_at: new Date()
|
||
}),
|
||
authConfig: {
|
||
passwordValidator: async (username: string, password: string) => {
|
||
return username === 'test' && password === 'password' ? 'user123' : null;
|
||
}
|
||
}
|
||
};
|
||
|
||
async function testAutoKeyGeneration() {
|
||
console.log('=== 测试自动生成密钥对功能 ===\n');
|
||
|
||
// 测试1: RS256算法自动生成RSA密钥对
|
||
console.log('1. 测试RS256算法自动生成RSA密钥对:');
|
||
try {
|
||
const providerRS256 = new OIDCProvider({
|
||
...baseConfig,
|
||
signingAlgorithm: 'RS256'
|
||
// 注意:没有提供signingKey
|
||
});
|
||
|
||
const jwks = await providerRS256.getJWKS();
|
||
console.log('✅ 成功生成RS256密钥对');
|
||
console.log('JWKS keys count:', jwks.keys.length);
|
||
console.log('First key algorithm:', jwks.keys[0]?.alg);
|
||
console.log('');
|
||
} catch (error) {
|
||
console.error('❌ RS256测试失败:', error);
|
||
}
|
||
|
||
// 测试2: ES256算法自动生成ECDSA密钥对
|
||
console.log('2. 测试ES256算法自动生成ECDSA密钥对:');
|
||
try {
|
||
const providerES256 = new OIDCProvider({
|
||
...baseConfig,
|
||
signingAlgorithm: 'ES256'
|
||
// 注意:没有提供signingKey
|
||
});
|
||
|
||
const jwks = await providerES256.getJWKS();
|
||
console.log('✅ 成功生成ES256密钥对');
|
||
console.log('JWKS keys count:', jwks.keys.length);
|
||
console.log('First key algorithm:', jwks.keys[0]?.alg);
|
||
console.log('');
|
||
} catch (error) {
|
||
console.error('❌ ES256测试失败:', error);
|
||
}
|
||
|
||
// 测试3: HS256算法没有signingKey应该失败
|
||
console.log('3. 测试HS256算法没有signingKey应该失败:');
|
||
try {
|
||
const providerHS256 = new OIDCProvider({
|
||
...baseConfig,
|
||
signingAlgorithm: 'HS256'
|
||
// 注意:没有提供signingKey,应该失败
|
||
});
|
||
|
||
// 调用getJWKS触发验证
|
||
await providerHS256.getJWKS();
|
||
console.error('❌ HS256测试失败:应该抛出错误但没有');
|
||
} catch (error) {
|
||
console.log('✅ HS256测试成功:正确抛出错误');
|
||
console.log('错误信息:', (error as Error).message);
|
||
console.log('');
|
||
}
|
||
|
||
// 测试4: HS256算法提供signingKey应该成功
|
||
console.log('4. 测试HS256算法提供signingKey应该成功:');
|
||
try {
|
||
const providerHS256 = new OIDCProvider({
|
||
...baseConfig,
|
||
signingKey: 'my-secret-key-at-least-32-characters-long',
|
||
signingAlgorithm: 'HS256'
|
||
});
|
||
|
||
const jwks = await providerHS256.getJWKS();
|
||
console.log('✅ HS256测试成功');
|
||
console.log('JWKS keys count:', jwks.keys.length, '(HS256不公开密钥)');
|
||
console.log('');
|
||
} catch (error) {
|
||
console.error('❌ HS256测试失败:', error);
|
||
}
|
||
|
||
console.log('=== 测试完成 ===');
|
||
}
|
||
|
||
// 运行测试
|
||
testAutoKeyGeneration().catch(console.error);
|