{"record":{"id":"08359f5fd3d1aec7","repo":"projectdiscovery/nuclei","slug":"azure-connection-details-are-missing-please-provi","errorCode":null,"errorMessage":"azure connection details are missing. Please provide %s","messagePattern":"azure connection details are missing\\. Please provide (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/runner/options.go","lineNumber":201,"sourceCode":"\tif options.HasClientCertificates() {\n\t\tif generic.EqualsAny(\"\", options.ClientCertFile, options.ClientKeyFile, options.ClientCAFile) {\n\t\t\treturn errors.New(\"if a client certification option is provided, then all three must be provided\")\n\t\t}\n\t\tvalidateCertificatePaths(options.Logger, options.ClientCertFile, options.ClientKeyFile, options.ClientCAFile)\n\t}\n\t// Verify AWS secrets are passed if a S3 template bucket is passed\n\tif options.AwsBucketName != \"\" && options.UpdateTemplates && !options.AwsTemplateDisableDownload {\n\t\tmissing := validateMissingS3Options(options)\n\t\tif missing != nil {\n\t\t\treturn fmt.Errorf(\"aws s3 bucket details are missing. Please provide %s\", strings.Join(missing, \",\"))\n\t\t}\n\t}\n\n\t// Verify Azure connection configuration is passed if the Azure template bucket is passed\n\tif options.AzureContainerName != \"\" && options.UpdateTemplates && !options.AzureTemplateDisableDownload {\n\t\tmissing := validateMissingAzureOptions(options)\n\t\tif missing != nil {\n\t\t\treturn fmt.Errorf(\"azure connection details are missing. Please provide %s\", strings.Join(missing, \",\"))\n\t\t}\n\t}\n\n\t// Verify that all GitLab options are provided if the GitLab server or token is provided\n\tif len(options.GitLabTemplateRepositoryIDs) != 0 && options.UpdateTemplates && !options.GitLabTemplateDisableDownload {\n\t\tmissing := validateMissingGitLabOptions(options)\n\t\tif missing != nil {\n\t\t\treturn fmt.Errorf(\"gitlab server details are missing. Please provide %s\", strings.Join(missing, \",\"))\n\t\t}\n\t}\n\n\t// verify that a valid ip version type was selected (4, 6)\n\tif len(options.IPVersion) == 0 {\n\t\t// add ipv4 as default\n\t\toptions.IPVersion = append(options.IPVersion, \"4\")\n\t}\n\tvar useIPV4, useIPV6 bool\n\tfor _, ipv := range options.IPVersion {","sourceCodeStart":183,"sourceCodeEnd":219,"githubUrl":"https://github.com/projectdiscovery/nuclei/blob/265b3a3dec374741614e342f813c10f8b38d2bb7/internal/runner/options.go#L183-L219","documentation":"Startup options validation (internal/runner/options.go:201) is the Azure mirror of the S3 check: when AzureContainerName is set with UpdateTemplates and -azure-template-disable-download is absent, validateMissingAzureOptions collects missing items among AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_SERVICE_URL and AZURE_CONTAINER_NAME, and the error enumerates exactly which are missing.","triggerScenarios":"Running `nuclei -update-templates -azure-container-name c` without the tenant id, client id, client secret, or service URL (flags or env equivalents).","commonSituations":"Private template distribution via Azure Blob storage; CI with only part of the env vars exported; rotated service principal leaving one value empty.","solutions":["Supply all Azure settings: tenant id, client id, client secret, and service URL (as named in the error)","Or disable Azure template downloads with -azure-template-disable-download","Verify the service principal has read access to the container to avoid the next failure after this one","Keep the full Azure variable set together in CI secrets so it cannot drift partially"],"exampleFix":"# before\nnuclei -update-templates -azure-container-name templates\n\n# after\nnuclei -update-templates -azure-container-name templates \\\n  -azure-tenant-id ... -azure-client-id ... \\\n  -azure-client-secret ... -azure-service-url core.windows.net","handlingStrategy":"validation","validationCode":"func missingAzure(o *types.Options) []string {\n    var m []string\n    if o.AzureTenantID == \"\" { m = append(m, \"AZURE_TENANT_ID\") }\n    if o.AzureClientID == \"\" { m = append(m, \"AZURE_CLIENT_ID\") }\n    if o.AzureClientSecret == \"\" { m = append(m, \"AZURE_CLIENT_SECRET\") }\n    if o.AzureServiceURL == \"\" { m = append(m, \"AZURE_SERVICE_URL\") }\n    if o.AzureContainerName == \"\" { m = append(m, \"AZURE_CONTAINER_NAME\") }\n    return m\n}\n\nif options.UpdateTemplates && options.AzureContainerName != \"\" && !options.AzureTemplateDisableDownload {\n    if m := missingAzure(options); len(m) > 0 {\n        return fmt.Errorf(\"incomplete Azure config: %v\", m)\n    }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Store the complete Azure credential set as one CI secret group so it cannot drift partially","Add a startup pre-flight mirroring validateMissingAzureOptions","Use -azure-template-disable-download when Azure distribution is not needed"],"tags":["go","nuclei","azure","configuration","cli","templates-distribution"],"backgroundTag":null,"analyzedSha":"265b3a3dec374741614e342f813c10f8b38d2bb7","analyzedAt":"2026-08-15T20:05:51.855Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}