# OIDC Provider - 自动生成密钥对示例

现在OIDC Provider支持为RSA和ECDSA算法自动生成密钥对，无需手动提供。

## 基本用法

### 使用RSA算法（自动生成密钥对）

```typescript
import { OIDCProvider } from '@your-package/oidc-provider';

// 直接使用构造函数创建Provider实例
const provider = new OIDCProvider({
    issuer: 'https://auth.example.com',
    signingAlgorithm: 'RS256', // 指定算法，密钥对将在首次使用时自动生成
    storage: storageAdapter,
    findUser: async (userId) => { /* 查找用户逻辑 */ },
    findClient: async (clientId) => { /* 查找客户端逻辑 */ },
    authConfig: {
        passwordValidator: async (username, password) => {
            // 验证用户名密码，返回用户ID或null
        }
    }
});
```

### 使用ECDSA算法（自动生成密钥对）

```typescript
const provider = new OIDCProvider({
    issuer: 'https://auth.example.com',
    signingAlgorithm: 'ES256', // ECDSA算法，密钥对将在首次使用时自动生成
    storage: storageAdapter,
    findUser: async (userId) => { /* 查找用户逻辑 */ },
    findClient: async (clientId) => { /* 查找客户端逻辑 */ },
    authConfig: {
        passwordValidator: async (username, password) => {
            // 验证用户名密码，返回用户ID或null
        }
    }
});
```

### 使用HMAC算法（需要提供密钥）

```typescript
const provider = new OIDCProvider({
    issuer: 'https://auth.example.com',
    signingKey: 'your-secret-key', // HS256必须提供密钥
    signingAlgorithm: 'HS256', // 可选，默认为HS256
    storage: storageAdapter,
    findUser: async (userId) => { /* 查找用户逻辑 */ },
    findClient: async (clientId) => { /* 查找客户端逻辑 */ },
    authConfig: {
        passwordValidator: async (username, password) => {
            // 验证用户名密码，返回用户ID或null
        }
    }
});
```

## 密钥生成时机

- **懒加载**：密钥对将在首次调用需要签名的方法时自动生成（如生成token、获取JWKS等）
- **一次生成**：每个Provider实例只会生成一次密钥对，后续调用会复用相同的密钥
- **控制台输出**：自动生成密钥对时会在控制台输出确认信息

## 注意事项

1. **生产环境建议**：在生产环境中，建议提前生成并持久化密钥对，而不是每次启动时重新生成
2. **HS256算法**：使用HS256时仍然需要提供`signingKey`
3. **同步构造**：现在可以直接使用`new OIDCProvider()`构造函数，无需异步等待
4. **密钥轮换**：如果需要密钥轮换，可以使用`JWTUtils.generateRSAKeyPair()`或`JWTUtils.generateECDSAKeyPair()`方法生成新的密钥对

## 手动提供密钥对

如果你想手动提供密钥对：

```typescript
import { JWTUtils } from '@your-package/oidc-provider';

// 生成密钥对
const keyPair = await JWTUtils.generateRSAKeyPair('my-key-id');

const provider = new OIDCProvider({
    issuer: 'https://auth.example.com',
    signingKey: keyPair, // 手动提供密钥对
    signingAlgorithm: 'RS256',
    // ... 其他配置
});
``` 