iflytek/astron-agent · error · IllegalArgumentException

Failed to build authentication URL

Error message

Failed to build authentication URL

What it means

buildAuthenticatedUrl constructs the HMAC-SHA256 signed URL for the image generation HTTP API (authorization/host/date query params). Any exception during URI creation, date formatting, MAC initialization, or URL encoding is wrapped as IllegalArgumentException('Failed to build authentication URL', cause). It indicates the request URL could not be signed, before any network call is made.

Solutions

  1. Inspect the wrapped cause exception in the stack trace to pinpoint the failure
  2. Verify platform account config has non-null platformApiKey and platformApiSecret
  3. Validate the imageHost constant is a well-formed absolute URL with a host
  4. Pre-check credentials before calling the client (fail fast with a config error instead of IllegalArgumentException)

Example fix

// before
String requestUrl = buildAuthenticatedUrl(imageHost, config.getPlatformApiKey(), config.getPlatformApiSecret(), "POST");
// after
String apiKey = config.getPlatformApiKey();
String apiSecret = config.getPlatformApiSecret();
if (StrUtil.isBlank(apiKey) || StrUtil.isBlank(apiSecret)) {
    throw new BusinessException(ResponseEnum.CONFIG_ERROR);
}
String requestUrl = buildAuthenticatedUrl(imageHost, apiKey, apiSecret, "POST");
Defensive patterns

Strategy: validation

Validate before calling

if (StrUtil.isBlank(apiKey) || StrUtil.isBlank(apiSecret) || URI.create(imageHost).getHost() == null) { throw new BusinessException(ResponseEnum.CONFIG_ERROR); }

Try / catch

try { JSONObject r = client.generateImage(uid, prompt, size); } catch (IllegalArgumentException e) { log.error("Auth URL build failed (config?)", e); throw new BusinessException(ResponseEnum.CONFIG_ERROR); }

Prevention

When it happens

Trigger: requestUrl is malformed (URI.create throws or uri.getHost() returns null), apiSecret is null (NPE on getBytes), or URLEncoder/String.format fails — thrown when generateImage calls buildAuthenticatedUrl(imageHost, apiKey, apiSecret, "POST").

Common situations: Missing iFlytek platform API secret in platform account config (null apiKey/apiSecret), imageHost changed to an invalid URL, or a broken URL constant after an environment config change.

Understand the failure class

Background: "Invalid URL" errors: why new URL(), URI.parse, and reqwest::Url reject your string — missing scheme, whitespace, and bad path format — this error's family across 39 libraries.

Related errors


AI-assisted analysis of iflytek/astron-agent@5e758547a8 (2026-09-12). Data as JSON: /api/errors/479b18793f3aea76. Report an issue: GitHub.

Appendix: source

Thrown at console/backend/hub/src/main/java/com/iflytek/astron/console/hub/util/BotAIServiceClient.java:514

            mac.init(spec);

            byte[] hexDigits = mac.doFinal(signatureString.getBytes(StandardCharsets.UTF_8));
            String signature = Base64.getEncoder().encodeToString(hexDigits);

            String authorization = String.format(
                    "hmac username=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"",
                    apiKey, "hmac-sha256", "host date request-line", signature);

            String authBase = Base64.getEncoder().encodeToString(authorization.getBytes(StandardCharsets.UTF_8));

            return String.format("%s?authorization=%s&host=%s&date=%s",
                    requestUrl,
                    URLEncoder.encode(authBase, StandardCharsets.UTF_8),
                    URLEncoder.encode(host, StandardCharsets.UTF_8),
                    URLEncoder.encode(date, StandardCharsets.UTF_8));

        } catch (Exception e) {
            throw new IllegalArgumentException("Failed to build authentication URL", e);
        }
    }

    /**
     * Build WebSocket authentication URL (for text generation)
     */
    private String buildWebSocketAuthUrl(String hostUrl, String apiKey, String apiSecret)
            throws IllegalArgumentException {
        try {
            URI uri = URI.create(hostUrl);
            SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
            format.setTimeZone(TimeZone.getTimeZone("GMT"));
            String date = format.format(new Date());

            String preStr = "host: " + uri.getHost() + "\n" +
                    "date: " + date + "\n" +
                    "GET " + uri.getPath() + " HTTP/1.1";

View on GitHub (pinned to 5e758547a8)