Package Exports
- @arendajaelu/nestjs-passport-apple
- @arendajaelu/nestjs-passport-apple/src/index.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@arendajaelu/nestjs-passport-apple) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
NestJS Passport Apple Strategy
This strategy seamlessly integrates Apple login capabilities into NestJS applications by leveraging Passport and its authentication framework.
Features
- Supports NestJS v10 and v11
- Utilizes Apple's OAuth2.0 for user authentication
- Uses NestJS's AuthGuard for easy integration
- Provides strongly-typed Profile object
Installation
npm install @arendajaelu/nestjs-passport-appleUsage
Strategy Setup
Here's a full example detailing all available options:
import { Injectable } from '@nestjs/common';
import { AuthGuard, PassportStrategy } from '@nestjs/passport';
import { Strategy, Profile } from '@arendajaelu/nestjs-passport-apple';
const APPLE_STRATEGY_NAME = 'apple';
@Injectable()
export class AppleStrategy extends PassportStrategy(Strategy, APPLE_STRATEGY_NAME) {
constructor() {
super({
clientID: process.env.APPLE_OAUTH_CLIENT_ID,
teamID: process.env.APPLE_TEAMID,
keyID: process.env.APPLE_KEYID,
key: process.env.APPLE_KEY_CONTENTS,
// OR
keyFilePath: process.env.APPLE_KEYFILE_PATH,
callbackURL: process.env.APPLE_OAUTH_CALLBACK_URL
scope: ['email', 'name'],
passReqToCallback: false,
});
}
async validate(_accessToken: string, _refreshToken: string, profile: Profile) {
return {
emailAddress: profile.email,
firstName: profile.name?.firstName || '',
lastName: profile.name?.lastName || '',
};
}
}
@Injectable()
export class AppleOAuthGuard extends AuthGuard(APPLE_STRATEGY_NAME) {}Note: Make sure to add
AppleStrategyto theprovidersarray in your module.
Using Guard in Controller
import { Controller, Get, Post, Req, UseGuards } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { AppleOAuthGuard } from './strategies/apple.strategy';
@ApiTags('oauth')
@Controller('oauth')
export class OAuthController {
@Get('apple')
@UseGuards(AppleOAuthGuard)
async appleLogin() {}
@Post('apple/callback')
@UseGuards(AppleOAuthGuard)
async appleCallback(@Req() req) {
return req.user;
}
}Strategy Options
clientID: Apple OAuth2.0 Client IDteamID: Apple Developer Team IDkeyID: Apple Key IDkey: Contents of the Apple Key. If you want the library to load the contents, usekeyFilePathinstead.keyFilePath: File path to Apple Key; library will load content usingfs.readFileSyncauthorizationURL: (Optional) Authorization URL; default ishttps://appleid.apple.com/auth/authorizetokenURL: (Optional) Token URL; default ishttps://appleid.apple.com/auth/tokenscope: (Optional) An array of scopes, e.g.,['email', 'name']sessionKey: (Optional) Session Keystate: (Optional) Should state parameter be usedpassReqToCallback: (Optional) Should request be passed to thevalidatecallback; default isfalsecallbackURL: (Optional) Callback URL
Validate Callback
The validate callback is called after successful authentication and contains the accessToken, refreshToken, and profile.
Tutorial: Apple Login with NestJS
For a detailed tutorial on implementing Apple Login with NestJS, refer to the following article:
How to Implement Apple Login with NestJS in Seconds
License
Licensed under MIT.