Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Presigned Url Laravel Package

tattali/presigned-url

Generate temporary signed URLs so clients can securely access private files for a limited time. Ideal for S3-compatible or local storage uploads and downloads without exposing credentials or making buckets public. Simple API for Laravel and plain PHP.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • Superficially a strong fit: a single-purpose Laravel package (service provider, facade, helper, middleware, publishable config) that drops into any Laravel app without architectural commitments. Low coupling, small blast radius, trivially removable.
  • The material issue is a capability mismatch between the repository description and the documented behavior. The GitHub description reads "S3-style presigned URLs for any storage backend," which implies AWS-style presigning that delegates object access to the storage provider (browser ↔ S3). The documentation, however, describes signing Laravel named routes with expiry and validating via middleware — i.e., temporary signed URLs for application endpoints.
  • These solve different problems. With this package, the request still lands on our application and the bytes still flow through our PHP workers (unless the controller redirects to a storage-native URL). The bandwidth-, memory-, and instance-sizing benefits claimed in the prior PM assessment (assessment-pm.md) do not follow from this package. S3 direct-to-storage uploads require the AWS SDK / Storage::temporaryUrl and a presigned POST/PUT flow.
  • Complements rather than replaces native Laravel: URL::signedRoute, URL::temporarySignedRoute, and the ValidateSignature middleware already provide this in core. The package's incremental value is limited to ergonomics — facade, helper, route macro, config-driven defaults, and a possibly stricter validation path. This reframes the build-vs-buy decision: the realistic alternative is "use the framework," not "hand-roll HMAC signing."

Integration feasibility

  • High. composer require, publish config, register a middleware alias, wrap target routes. No schema changes, no infrastructure changes, no credential provisioning. A competent Laravel developer can produce a working pilot in under a day.
  • Requires discipline on which routes get signed and what the controller is allowed to do (no user-controlled redirect targets, no signing of state-changing verbs).

Technical risk

  • Supply chain / bus factor: high. Zero stars, zero dependents, a single maintainer, and a version history consisting of 1.0.0 → 1.0.1. There is no community vetting of the signature implementation, no third-party security review, and no evidence of a response process for vulnerabilities. For a component that is a security boundary, this is the dominant risk. Note also that the listed release date (2026-10-24) is inconsistent with a normal timeline and should be verified against the repository before relying on it.
  • Cryptographic correctness must be reviewed in-house before production: HMAC algorithm, constant-time comparison, what is included in the signed payload (path, method, expiry, user/tenant scope), whether expiry is signed or merely appended, and whether canonicalization is stable behind proxies and CDNs.
  • Host/scheme sensitivity. Absolute-URL signing breaks across load balancers, TLS termination, multiple domains, or preview environments when the trusted-host/scheme differs at generation vs. validation time.
  • Key rotation hazard. If signing keys derive from APP_KEY, rotating it invalidates every outstanding link — an operational incident with a security-triggered cause.
  • No revocation. Links remain valid for their full TTL; leakage via referrer headers, browser history, support tickets, or logs cannot be clawed back.
  • Expectation risk. The description invites the wrong architecture. Teams adopting on the "offload bytes to S3" premise will build the wrong design and discover it late.

Key questions

  1. Is the intended capability signed application routes or S3 direct-to-storage presigning? Which do our roadmap features actually need?
  2. What does this package provide over URL::temporarySignedRoute + ValidateSignature that justifies a third-party security dependency?
  3. Does it support signing a scope (tenant ID, user ID, single-use nonce) — or only path + expiry?
  4. Where do signing keys come from, and what is the rotation story?
  5. Is there a security contact, disclosure policy, or any maintainer activity beyond the single patch release?
  6. What are the Laravel/PHP version constraints, and do they cover our current and next LTS?
  7. Does the middleware alias collide with Laravel's built-in signed alias?
  8. Has anyone audited the signature comparison for timing safety?

Integration Approach

Stack fit

  • Laravel-only, conventional package structure, no framework-version lock-in evident from the docs. Fits our stack provided we confirm composer.json constraints cover our current Laravel and PHP versions.
  • Storage-backend agnostic in the sense that it never touches storage — the signed route points at a controller we write. That is flexibility, but it also means the file-serving path, streaming, range requests, and access checks remain ours to build.
  • Best positioned as a convenience layer for temporary access to app endpoints (invitations, exports, magic-link-style downloads, webhook-free one-time actions), not as a file-transfer architecture.

Migration path

  • Greenfield use is trivial: add the package, define TTLs in config, annotate routes.
  • Brownfield: the realistic migration is from ad-hoc signing logic or from native temporarySignedRoute calls. Both are cheap. There is no data migration, no dual-write period, no cutover risk.
  • Given the shallow release history, treat 1.0.1 as a pinned dependency (1.0.1 exact, not ^1.0) with the lockfile committed and vendor diff reviewed on any bump.
  • If the underlying need is genuinely S3 direct transfer, the migration path is elsewhere: AWS SDK presigned PUT/POST, storage CORS configuration, and client-side upload UX. Do not attempt to reach that outcome through this package.

Compatibility

  • Verify against our Laravel and PHP matrix before scheduling; a single-maintainer package may lag framework majors.
  • Check for middleware alias and helper-name collisions with Laravel core and with any existing signing/URL utilities.
  • Confirm behavior under our reverse proxy and any CDN: which host and scheme the package uses to build and to verify the signature. This is the most likely source of "works locally, fails in staging" defects.

Sequencing

  1. Two-week spike, no production dependency. Read the source, confirm the capability boundary, compare line-for-line against URL::temporarySignedRoute. Produce a written build-vs-adopt recommendation.
  2. Pilot on one low-blast-radius flow (e.g., a report export download or an invitation link) behind a feature flag, with a short TTL.
  3. Validate in a proxied environment — staging behind the same LB/CDN topology as production — before expanding.
  4. Expand only if the spike shows a concrete ergonomic or security advantage over core. If not, adopt framework-native signing, drop the dependency, and bank the reduced risk.
  5. In parallel, decouple the S3 question. If direct-to-storage is on the roadmap, scope it as a separate workstream; the prior assessment's cost and scaling arguments belong there, not here.

Operational Impact

Maintenance

  • Code surface is small and the package is stable in the narrow sense that nothing is changing. The maintenance burden is not patching — it is ongoing vigilance: monitoring a low-visibility repository for security fixes we would otherwise never hear about, and being prepared to fork or replace on short notice. Budget a named owner.
  • Because we consume a security primitive from an unvetted single-maintainer source, plan for periodic in-house review of the signing and validation code, not just version bumps. If that review is not something we will actually do, we should not adopt.

Support

  • No community, no commercial backing, no SLA. All support is internal. Acceptable only if the engineering team can read and reason about the ~few hundred lines involved.
  • Documentation is adequate for the happy path; edge cases (proxy hosts, key rotation, custom scopes) will require source reading.

Scaling

  • Favorable. Signature generation and validation are stateless HMAC operations — CPU-trivial, horizontally scalable, no database or cache dependency, no coordination between nodes.
  • The scaling caveat is not the package but the pattern: signed URLs that resolve to application controllers keep file bytes on our app tier. If a flow is high-volume, that is the wrong shape regardless of signing library, and volume growth will surface as egress and worker saturation rather than as a package limitation.
  • Clock consistency matters at fleet scale — enforce NTP; skew manifests as sporadic, hard-to-reproduce 403s.

Failure modes

  • Clock skew / drift → signatures rejected or accepted past expiry. Symptom: intermittent 403s on a subset of nodes.
  • APP_KEY (or signing key) rotation → all outstanding links invalid simultaneously. Symptom: mass user-facing link failures correlated with an unrelated security change. Mitigate with a documented rotation runbook and short TTLs.
  • Proxy/CDN host or scheme mismatch → signatures fail only in proxied environments. Symptom: staging/production-only 403s.
  • Link leakage with no revocation → a forwarded or logged URL is valid until TTL. Mitigate with short TTLs, single-use nonces if supported, and scoping to a specific resource rather than a generic endpoint.
  • Open-redirect / abuse → if a signed route accepts a user-supplied destination, signing confers legitimacy on attacker-chosen targets. Constrain targets server-side.
  • Expired-link UX → users hit dead ends; needs a product-level recovery path, which is our work, not the package's.
  • Abandonment → no upstream fixes for a future framework incompatibility; we fork or remove. Low cost given the small surface, but non-zero.

Ramp-up

  • Hours, not days, for any developer familiar with Laravel middleware and route definitions. The real ramp-up cost is the security review and the proxy/clock operational checklist — roughly one engineer-week of diligence for a production rollout, which is disproportionate to the package's size and is itself a signal about whether the dependency earns its place.
  • Onboarding friction is low enough that the risk is casual adoption without the review. Gate it: this should require a documented decision, not a composer require in a feature branch.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
uni-method/symfony-lib
tacticmedia/scim-server-bundle
neika-ai/symfony-bundle
mattleads/agent-publishing-bundle
glavweb/framework-bundle
glavweb/extra-bundle
glavweb/api-bundle
glavweb/admin-bundle
adachsoft/api-version-bundle
elsayed85/laravel-api-exceptions
ouhssini/laravel-demo-mode
daworks/ncloud-outbound-mailer-driver
gp247/cms
ignibyte/aic-gates
nexa-merchant/blog
novasa/laravel-language-center
opencage/geocode
adolfoholzer/parameters
livenetworks/ln-starter
cgv/localized-resource