如何修改OpenIdDict Device Code Flow中user_code的长度?
问题:OpenIddict 5.0.1 中如何缩短Device Code Flow的user_code长度?
我正在使用OpenIddict 5.0.1版本实现OAuth的Device Code Flow,当前/device端点返回的数据如下:
{ "device_code": "lyJe_PgWGfOblSS6PhX67hF_ebKjTN1UZeMO3KWtJt0", "user_code": "8539-7540-1784", "verification_uri": "..." }
其中user_code是12位数字,用户手动输入时长度过长。我尝试自定义/device端点,但发现OpenIddict仅支持通过EnableAuthorizationEndpointPassthrough()自定义/authorize端点,没有类似的/device端点透传选项:
options .AllowAuthorizationCodeFlow() .AllowDeviceCodeFlow(); options.UseAspNetCore() .EnableAuthorizationEndpointPassthrough();
我没找到其他可自定义user_code格式的配置项,请问能否生成更短的user_code?比如"6745-3454"这种8位带分隔符的格式?
解决方案
在OpenIddict 5.x中,你可以通过自定义设备码生成器来修改user_code的格式和长度,无需自定义整个/device端点。具体步骤如下:
- 实现
IOpenIddictDeviceCodeGenerator接口,编写自定义的user_code生成逻辑:
using OpenIddict.Core; using OpenIddict.Models; public class CustomDeviceCodeGenerator : IOpenIddictDeviceCodeGenerator { private readonly Random _random = new Random(); public ValueTask<OpenIddictDeviceCodeDescriptor> GenerateAsync(OpenIddictDeviceCodeGenerationContext context, CancellationToken cancellationToken) { // 生成8位随机数字,格式为XXXX-XXXX var part1 = _random.Next(1000, 9999).ToString("D4"); var part2 = _random.Next(1000, 9999).ToString("D4"); var userCode = $"{part1}-{part2}"; var descriptor = new OpenIddictDeviceCodeDescriptor { // 可复用默认device_code生成逻辑,或自定义生成规则 DeviceCode = Guid.NewGuid().ToString("N"), UserCode = userCode, ExpiresIn = context.Options.DeviceCodeLifetime }; return ValueTask.FromResult(descriptor); } }
- 在依赖注入容器中替换默认的生成器服务:
builder.Services.AddOpenIddict() .AddCore(options => { // 注册自定义设备码生成器,替换默认实现 options.ReplaceService<IOpenIddictDeviceCodeGenerator, CustomDeviceCodeGenerator>(lifetime: ServiceLifetime.Singleton); }) .AddServer(options => { options.AllowAuthorizationCodeFlow() .AllowDeviceCodeFlow(); options.UseAspNetCore() .EnableAuthorizationEndpointPassthrough(); });
注意事项
- 自定义
user_code时需保证足够的随机性,避免重复或被轻易猜测; - 若你的项目需要持久化设备码数据,要确保存储逻辑兼容自定义格式的
user_code; - 如果想保留OpenIddict默认的
device_code生成逻辑,可以注入默认生成器并调用其方法复用。
内容的提问来源于stack exchange,提问作者Claudio
相关产品推荐
相关产品推荐

