func ValidateUCANToken(token string) (bool, error) {
// 1. Parse the token
parsedToken, err := jwt.Parse(token, keyFunc)
if err != nil {
return false, err
}
// 2. Verify issuer DID
issuerDID := parsedToken.Claims["iss"]
if !isDIDValid(issuerDID) {
return false, errors.New("invalid issuer DID")
}
// 3. Check audience
audienceDID := parsedToken.Claims["aud"]
if !isCurrentUserAudience(audienceDID) {
return false, errors.New("token not intended for this audience")
}
// 4. Validate time constraints
if isTokenExpired(parsedToken) {
return false, errors.New("token has expired")
}
// 5. Check capabilities
capabilities := parsedToken.Claims["att"]
if !validateCapabilities(capabilities) {
return false, errors.New("insufficient capabilities")
}
// 6. Verify proofs (if present)
proofs := parsedToken.Claims["prf"]
if !validateProofChain(proofs) {
return false, errors.New("invalid proof chain")
}
return true, nil
}