Hi Dan,
It sounds like the "dynamic secrets" process and scripts discussed here:
would be useful to your situation.
Lastly, I haven't tried this but you might be able to use sshd's ForceCommand config or a ssh key command= option to specifically call a wrapper script that calls the vault-ssh-helper util and spawns a shell on success. This would require setup on a long running shared user account but still allow you to use the "one timeyness" offered by OTP with no/low system config changes.
HTH,
-n
ps.. In a non-vault way, assuming you're using the ldap patch on a modern openssh to store pubkeys in ldap and contractors have no access to update ldap, you could generate a key for a contractor on a shared user, give them the private side, and have the public side in ldap expire using the expiry-time= option. See the AUTHORIZED_KEYS FILE FORMAT section in sshd(8) for info.