Skip to main content

Passphrase-gated links

For a high-value link you can require a shared secret. You deliver the passphrase out of band, and the recipient enters it on the confirmation page before the link is consumed:

$link = $issuer->issueLink($user, passphrase: 'the-secret-you-shared');

The passphrase is stored only as a hash, through Hash::make(), so it uses whatever driver your application configured. It's verified before the token is spent, so a wrong passphrase never consumes a use of a multi-use link. Wrong and missing passphrases fail through the same generic, rate-limited response as any other bad link, so they leak nothing. A rejected passphrase isn't flashed back into the session either.

When a link carries a passphrase the confirmation page shows a passphrase field automatically. A custom confirmation screen can ask the store directly with TokenStore::requiresPassphrase($token) — see the contract reference.

This is a gate, not a second factor

This is a passphrase gate, not two-factor authentication. It is a lightweight shared-secret check, not a possession factor.

The real second factor remains the Fortify TOTP handoff. A passphrase-gated link for a two-factor user still hands off to the TOTP challenge after the passphrase is accepted: the passphrase is an additional gate in front of that flow, never a replacement for it or a way around it.