- New ArkApiKey model (encrypted storage, bound to user+project) - Admin enters API Key from Volcengine console into AirGate - Sub-accounts can only view their own keys - Reveal endpoint decrypts key on demand with audit log - Updated research report: documented Ark API limitation (CreateApiKey doesn't return plaintext) and manual entry solution Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
37 lines
1.7 KiB
Python
37 lines
1.7 KiB
Python
# Generated by Django 4.2.21 on 2026-03-20 17:21
|
||
|
||
from django.db import migrations, models
|
||
import django.db.models.deletion
|
||
|
||
|
||
class Migration(migrations.Migration):
|
||
|
||
dependencies = [
|
||
('monitor', '0006_iamuser_saved_policies_on_disable'),
|
||
]
|
||
|
||
operations = [
|
||
migrations.CreateModel(
|
||
name='ArkApiKey',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('project_name', models.CharField(max_length=200, verbose_name='所属项目')),
|
||
('key_name', models.CharField(max_length=200, verbose_name='Key 名称/用途')),
|
||
('api_key_enc', models.TextField(verbose_name='API Key(加密)')),
|
||
('api_key_hint', models.CharField(blank=True, max_length=30, verbose_name='API Key 提示(脱敏)')),
|
||
('status', models.CharField(choices=[('active', '启用'), ('disabled', '停用')], default='active', max_length=20, verbose_name='状态')),
|
||
('remark', models.TextField(blank=True, verbose_name='备注')),
|
||
('created_by', models.CharField(blank=True, max_length=100, verbose_name='录入人')),
|
||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||
('updated_at', models.DateTimeField(auto_now=True)),
|
||
('iam_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ark_keys', to='monitor.iamuser')),
|
||
],
|
||
options={
|
||
'verbose_name': '方舟 API Key',
|
||
'verbose_name_plural': '方舟 API Key',
|
||
'db_table': 'airgate_ark_api_key',
|
||
'ordering': ['-created_at'],
|
||
},
|
||
),
|
||
]
|