This is not something you'd want to do if you're building an application the traditional laravel way––that is, a monolithic app. I've had to do this recently while working on a project that has the backend and frontend existing in different code bases.
Normally, when you setup a laravel project for new users to verify their email, a temporarily signed url is generated and sent to them. The url is generated based on the project's set APP_URL
in the .env
file and, subsequently, in the /config/app.php
file.
The problem arises when you are building a SPA front end for a laravel backend api. In that case, you may have your frontend at, say, http://cool-app.com
and the backend at http://api.cool-app.com
. Because the user will not have a direct access to the api endpoints, it won't be ideal to generate a user-clickable link based on the api's base url. What you'd want is a url that is based on the frontend's base url. So, how can that be achieved? Easy.
Create a custom method for generating the URL and pass it to the createUrlUsing
method of the VerifyEmail
notification class.
/**
* Set a callback that should be used when creating the email verification URL.
*
* @param \Closure $callback
* @return void
*/
public static function createUrlUsing($callback)
{
static::$createUrlCallback = $callback;
}
The only other step that we have to take is to call this function inside the AuthServiceProvider
passing the callback that returns our custom URL. The complete code is as below:
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
...
VerifyEmail::createUrlUsing(function ($notifiable) {
$frontendUrl = 'http://cool-app.com/auth/email/verify';
$verifyUrl = URL::temporarySignedRoute(
'verification.verify',
Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)),
[
'id' => $notifiable->getKey(),
'hash' => sha1($notifiable->getEmailForVerification()),
]
);
return $frontendUrl . '?verify_url=' . urlencode($verifyUrl);
});
}
In the frontend, you can have a page with a logic that makes a GET
http request to the verify_url
. And, there you have it––a customized email verification url!
Top comments (0)