To implement Sign in with Apple functionality in your Laravel REST API, you'll need to follow these steps:
-
Prerequisites
An Apple Developer account
A registered app in Apple Developer portal
Laravel 8.x or higher
PHP 7.4 or higher
-
Setup Apple Developer Configuration
Go to Apple Developer Portal
Create a new App ID with "Sign In with Apple" capability enabled
Note your Service ID (e.g., com.example.app)
Generate a private key for "Sign In with Apple" and download it
Install Required Packages
composer require laravel/socialite
composer require socialiteproviders/apple
- Configuration
Add these to your .env file:
APPLE_CLIENT_ID=nz.co.fskills.app
APPLE_TEAM_ID=J43F88Y4BH
APPLE_KEY_ID=CLU5NYTK5P
APPLE_PRIVATE_KEY_PATH=storage/apple_private_key.pem
config/services.php
'apple' => [
'client_id' => env('APPLE_CLIENT_ID'),
'client_secret' => env('APPLE_CLIENT_SECRET'),
'redirect' => env('APPLE_REDIRECT_URI')
],
Store the apple_private_key.pem in storage/apple_private_key.pem
-----BEGIN PRIVATE KEY-----
Example key
-----END PRIVATE KEY-----
Create an Controller :
public function SocialLogin(Request $request): \Illuminate\Http\JsonResponse
{
$request->validate([
'token' => 'required',
'provider' => 'required|in:google,facebook,apple',
]);
try {
$provider = $request->provider;
$socialUser = Socialite::driver($provider)->stateless()->userFromToken($request->token);
//return response()->json($socialUser);
if ($socialUser) {
$user = User::withTrashed()->where('email', $socialUser->email)->first();
if (!empty($user->deleted_at)) {
return Helper::jsonErrorResponse('Your account has been deleted.',410);
}
$isNewUser = false;
if (!$user) {
$password = Str::random(16);
$user = User::create([
'name' => $socialUser->getName(),
'email' => $socialUser->getEmail(),
'password' => bcrypt($password),
'avatar' => $socialUser->getAvatar(),
'email_verified_at' => now(),
]);
$isNewUser = true;
}
Auth::login($user);
$token = auth('api')->login($user);
return response()->json([
'status' => true,
'message' => 'User logged in successfully.',
'code' => 200,
'token_type' => 'bearer',
'token' => $token,
'expires_in' => auth('api')->factory()->getTTL() * 60,
'data' => $user,
],200);
} else {
return Helper::jsonResponse(false, 'Unauthorized', 401);
}
} catch (Exception $e) {
return Helper::jsonResponse(false, 'Something went wrong', 500, ['error' => $e->getMessage()]);
}
}
Create a route:
Route::post('/social-login', [SocialLoginController::class, 'SocialLogin']);
Top comments (0)