You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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端点。具体步骤如下:

  1. 实现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);
    }
}
  1. 在依赖注入容器中替换默认的生成器服务:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:55:16