{"record":{"id":"42ba66cd521e2795","repo":"AlistGo/alist","slug":"login-failed-provide-a-valid-access-token-or-ref","errorCode":null,"errorMessage":"login failed: provide a valid access_token, or refresh_token, or phone_number + verify_code + captcha_token","messagePattern":"login failed: provide a valid access_token, or refresh_token, or phone_number \\+ verify_code \\+ captcha_token","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"drivers/guangyapan/driver.go","lineNumber":152,"sourceCode":"\t\t\t\treturn err\n\t\t\t}\n\t\t\tif err := d.validateToken(ctx); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn d.prepareRootFolder(ctx)\n\t\t}\n\t\tif d.SendCode {\n\t\t\td.setTempStatus(\"SMS sending in progress...\")\n\t\t\tif err := d.prepareSMSCode(ctx); err != nil {\n\t\t\t\td.setTempStatus(fmt.Sprintf(\"SMS send failed: %v. Please check captcha/meta and set send_code=true to retry.\", err))\n\t\t\t\tlog.Warnf(\"guangyapan: prepare sms code failed: %v\", err)\n\t\t\t} else {\n\t\t\t\td.setTempStatus(\"SMS sent successfully. Please fill verify_code and save to complete login.\")\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\treturn errors.New(\"login failed: provide a valid access_token, or refresh_token, or phone_number + verify_code + captcha_token\")\n}\n\nfunc (d *GuangYaPan) Drop(ctx context.Context) error {\n\treturn nil\n}\n\nfunc (d *GuangYaPan) GetRoot(ctx context.Context) (model.Obj, error) {\n\trootID, err := d.getRootFolderID(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &model.Object{\n\t\tID:       rootID,\n\t\tPath:     \"/\",\n\t\tName:     \"root\",\n\t\tSize:     0,\n\t\tModified: d.Modified,\n\t\tIsFolder: true,","sourceCodeStart":134,"sourceCodeEnd":170,"githubUrl":"https://github.com/AlistGo/alist/blob/843d9dc8149126976b2625911e45a4d3ffd6f2f5/drivers/guangyapan/driver.go#L134-L170","documentation":"GuangYaPan (光雅盘) driver Init: after checking access_token, refresh_token and SMS-based login paths, none of the required credential combinations were present in the storage configuration. The driver requires at least one of: a valid access_token, a refresh_token, or the phone_number + verify_code + captcha_token triple to authenticate.","triggerScenarios":"Saving/loading a GuangYaPan storage where AccessToken, RefreshToken are empty and the phone/SMS fields (phone_number, verify_code, captcha_token) are incomplete — e.g. only phone_number filled, or SMS login was started but never completed.","commonSituations":"First-time setup where the user pasted only a username, copied an expired/blank token, or abandoned the two-step SMS login midway (sent code but never entered it).","solutions":["Paste a valid access_token (from browser dev-tools on the provider's site) into the storage config","Or provide a refresh_token so the driver can renew access itself","Or complete SMS login: fill phone_number + captcha_token, set send_code=true to get the code, then fill verify_code and save","Make sure no field has whitespace-only content — the driver trims and treats it as empty"],"exampleFix":"// before: storage config\naccess_token: \"\"\nrefresh_token: \"\"\nphone_number: \"13800138000\" // alone is not enough\n// after\nphone_number: \"13800138000\"\nverify_code: \"123456\" // received via SMS\ncaptcha_token: \"...\" // from provider captcha","handlingStrategy":"validation","validationCode":"// Validate storage config before Init\nhasToken := strings.TrimSpace(cfg.AccessToken) != \"\"\nhasRefresh := strings.TrimSpace(cfg.RefreshToken) != \"\"\nhasSMS := cfg.PhoneNumber != \"\" && cfg.VerifyCode != \"\" && cfg.CaptchaToken != \"\"\nif !hasToken && !hasRefresh && !hasSMS {\n\treturn errors.New(\"guangyapan: supply access_token, refresh_token, or complete SMS credentials\")\n}","typeGuard":"func smsLoginReady(c GuangYaPanConfig) bool {\n\treturn c.PhoneNumber != \"\" && c.VerifyCode != \"\" && c.CaptchaToken != \"\"\n}","tryCatchPattern":"if err := storage.Init(ctx); err != nil {\n\tif strings.Contains(err.Error(), \"login failed: provide a valid\") {\n\t\t// guide user to the credential form rather than retrying\n\t\treturn errors.New(\"open storage settings and fill access_token / refresh_token / SMS fields\")\n\t}\n\treturn err\n}","preventionTips":["Prefer pasting a refresh_token captured from the provider's web session — it survives expiry","Complete the SMS flow in one sitting: captcha -> send_code -> verify_code -> save","Trim credentials when pasting; stray spaces make fields read as empty"],"tags":["guangyapan","authentication","configuration","driver"],"backgroundTag":null,"analyzedSha":"843d9dc8149126976b2625911e45a4d3ffd6f2f5","analyzedAt":"2026-08-15T12:14:11.722Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}