So regarding the wallet features, I’d split authentication and wallets into two separate things in the dapp. Then users can authenticate with their preferred method and connect (additional) wallets when needed for e.g. token specific features in the dapp.
As for login you’ve mentioned, there’s two types you’ve mentioned Google and email.
Regarding Google authentication, you could implement an OpenID flow as mentioned here How to generate delegated identity on server and send to browser - #8 by frederikrothenberger. Further down this thread you’ll also find a proof of concept implementation of such flow.
The email authentication is a bit more complicated, since your canister would need to send emails through http outcalls to e.g. an email api service e.g. SendGrid. Then emails would be used for either passwords (and password resets) and/or magic link login.
Keep the security aspect in mind while designing such flows, http calls and canister state are technically public so avoid storing and sending secrets.
Overall, I’d probably recommend skipping authentication by email/password and recommend passkeys instead. Your browser even synces them across devices for the user these days. The WebAuthnIdentity in the agent-js already offers this.
Keep in mind you might still want to implement an account recovery flow by e.g. seed phrase (like II does) or further investigate such flow by email.