AlistGo/alist · critical

login failed: provide a valid access_token, or refresh_token

Error message

login failed: provide a valid access_token, or refresh_token, or phone_number + verify_code + captcha_token

What it means

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.

Source

Thrown at drivers/guangyapan/driver.go:152

				return err
			}
			if err := d.validateToken(ctx); err != nil {
				return err
			}
			return d.prepareRootFolder(ctx)
		}
		if d.SendCode {
			d.setTempStatus("SMS sending in progress...")
			if err := d.prepareSMSCode(ctx); err != nil {
				d.setTempStatus(fmt.Sprintf("SMS send failed: %v. Please check captcha/meta and set send_code=true to retry.", err))
				log.Warnf("guangyapan: prepare sms code failed: %v", err)
			} else {
				d.setTempStatus("SMS sent successfully. Please fill verify_code and save to complete login.")
			}
		}
		return nil
	}
	return errors.New("login failed: provide a valid access_token, or refresh_token, or phone_number + verify_code + captcha_token")
}

func (d *GuangYaPan) Drop(ctx context.Context) error {
	return nil
}

func (d *GuangYaPan) GetRoot(ctx context.Context) (model.Obj, error) {
	rootID, err := d.getRootFolderID(ctx)
	if err != nil {
		return nil, err
	}
	return &model.Object{
		ID:       rootID,
		Path:     "/",
		Name:     "root",
		Size:     0,
		Modified: d.Modified,
		IsFolder: true,

View on GitHub (pinned to 843d9dc814)

Solutions

  1. Paste a valid access_token (from browser dev-tools on the provider's site) into the storage config
  2. Or provide a refresh_token so the driver can renew access itself
  3. Or complete SMS login: fill phone_number + captcha_token, set send_code=true to get the code, then fill verify_code and save
  4. Make sure no field has whitespace-only content — the driver trims and treats it as empty

Example fix

// before: storage config
access_token: ""
refresh_token: ""
phone_number: "13800138000" // alone is not enough
// after
phone_number: "13800138000"
verify_code: "123456" // received via SMS
captcha_token: "..." // from provider captcha
Defensive patterns

Strategy: validation

Validate before calling

// Validate storage config before Init
hasToken := strings.TrimSpace(cfg.AccessToken) != ""
hasRefresh := strings.TrimSpace(cfg.RefreshToken) != ""
hasSMS := cfg.PhoneNumber != "" && cfg.VerifyCode != "" && cfg.CaptchaToken != ""
if !hasToken && !hasRefresh && !hasSMS {
	return errors.New("guangyapan: supply access_token, refresh_token, or complete SMS credentials")
}

Type guard

func smsLoginReady(c GuangYaPanConfig) bool {
	return c.PhoneNumber != "" && c.VerifyCode != "" && c.CaptchaToken != ""
}

Try / catch

if err := storage.Init(ctx); err != nil {
	if strings.Contains(err.Error(), "login failed: provide a valid") {
		// guide user to the credential form rather than retrying
		return errors.New("open storage settings and fill access_token / refresh_token / SMS fields")
	}
	return err
}

Prevention

When it happens

Trigger: 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.

Common situations: 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).

Related errors


AI-assisted analysis of AlistGo/alist@843d9dc814 (2026-08-15). Data as JSON: /api/errors/42ba66cd521e2795. Report an issue: GitHub.