UNPKG

oauth2-server-grant-type-apple

Version:
1 lines 5.71 kB
{"version":3,"file":"index.cjs","names":["AbstractGrantType","InvalidArgumentError","InvalidRequestError","InvalidTokenError"],"sources":["../src/verify-token.ts","../src/apple-grant-type.ts"],"sourcesContent":["import { createRemoteJWKSet, jwtVerify } from 'jose';\nimport type { AppleTokenData } from './types.js';\n\nconst JWKS = createRemoteJWKSet(new URL('https://appleid.apple.com/auth/keys'));\n\nconst ISSUER = 'https://appleid.apple.com';\n\nexport const verifyToken = async ({\n token,\n audience,\n}: {\n token: string;\n audience?: string | string[];\n}): Promise<AppleTokenData> => {\n const { payload } = await jwtVerify<AppleTokenData>(token, JWKS, {\n algorithms: ['RS256'],\n issuer: ISSUER,\n audience,\n });\n\n return payload;\n};\n","import {\n AbstractGrantType,\n InvalidArgumentError,\n InvalidRequestError,\n InvalidTokenError,\n} from '@node-oauth/oauth2-server';\nimport type {\n Request,\n Client,\n TokenOptions,\n User,\n Token,\n} from '@node-oauth/oauth2-server';\nimport { verifyToken } from './verify-token.js';\nimport type { AppleTokenData, Model } from './types.js';\n\nexport interface Options extends TokenOptions {\n model: Model;\n}\n\nexport class AppleGrantType extends AbstractGrantType {\n model: Model;\n appIds: string[] = [];\n\n constructor(options: Options) {\n super(options);\n\n if (!options.model) {\n throw new InvalidArgumentError('Missing parameter: `model`');\n }\n\n if (!options.model.getUserWithApple) {\n throw new InvalidArgumentError(\n 'Invalid argument: model does not implement `getUserWithApple()`',\n );\n }\n\n if (!options.model.saveToken) {\n throw new InvalidArgumentError(\n 'Invalid argument: model does not implement `saveToken()`',\n );\n }\n\n this.model = options.model;\n\n const appId = this.model.appleGrantType?.appId;\n\n if (appId) {\n this.appIds = Array.isArray(appId) ? appId : [appId];\n }\n\n if (this.appIds.length === 0) {\n throw new InvalidArgumentError(\n 'Invalid argument: Apple valid appId must be provided in options',\n );\n }\n\n this.handle = this.handle.bind(this);\n this.getUser = this.getUser.bind(this);\n this.saveToken = this.saveToken.bind(this);\n }\n\n async handle(request: Request, client: Client) {\n if (!request) {\n throw new InvalidArgumentError('Missing parameter: `request`');\n }\n\n if (!client) {\n throw new InvalidArgumentError('Missing parameter: `client`');\n }\n\n const scope = this.getScope(request);\n const user = await this.getUser(request);\n\n return await this.saveToken(user, client, scope);\n }\n\n async getUser(request: Request) {\n const token = request.body.apple_token;\n const name = request.body.name;\n\n if (!token) {\n throw new InvalidRequestError('Missing parameter: `apple_token`');\n }\n\n let data: AppleTokenData;\n\n try {\n data = await verifyToken({\n token,\n audience: this.appIds,\n });\n } catch {\n throw new InvalidTokenError('Apple id token is invalid or expired');\n }\n\n return await this.model.getUserWithApple({ name, ...data });\n }\n\n async saveToken(user: User, client: Client, scope: string[]) {\n const validatedScope = await this.validateScope(user, client, scope);\n const accessToken = await this.generateAccessToken(client, user, scope);\n const refreshToken = await this.generateRefreshToken(client, user, scope);\n const accessTokenExpiresAt = this.getAccessTokenExpiresAt();\n const refreshTokenExpiresAt = this.getRefreshTokenExpiresAt();\n\n const token: Token = {\n accessToken,\n accessTokenExpiresAt,\n refreshToken,\n refreshTokenExpiresAt,\n scope: validatedScope || [],\n user: {\n id: user.id,\n },\n client,\n };\n\n return await this.model.saveToken(token, client, user);\n }\n}\n"],"mappings":";;;;AAGA,MAAM,QAAA,GAAA,KAAA,oBAA0B,IAAI,IAAI,qCAAqC,CAAC;AAE9E,MAAM,SAAS;AAEf,MAAa,cAAc,OAAO,EAChC,OACA,eAI6B;CAC7B,MAAM,EAAE,YAAY,OAAA,GAAA,KAAA,WAAgC,OAAO,MAAM;EAC/D,YAAY,CAAC,OAAO;EACpB,QAAQ;EACR;CACF,CAAC;CAED,OAAO;AACT;;;ACDA,IAAa,iBAAb,cAAoCA,0BAAAA,kBAAkB;CAIpD,YAAY,SAAkB;EAC5B,MAAM,OAAO;gBAHI,CAAC;EAKlB,IAAI,CAAC,QAAQ,OACX,MAAM,IAAIC,0BAAAA,qBAAqB,4BAA4B;EAG7D,IAAI,CAAC,QAAQ,MAAM,kBACjB,MAAM,IAAIA,0BAAAA,qBACR,iEACF;EAGF,IAAI,CAAC,QAAQ,MAAM,WACjB,MAAM,IAAIA,0BAAAA,qBACR,0DACF;EAGF,KAAK,QAAQ,QAAQ;EAErB,MAAM,QAAQ,KAAK,MAAM,gBAAgB;EAEzC,IAAI,OACF,KAAK,SAAS,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;EAGrD,IAAI,KAAK,OAAO,WAAW,GACzB,MAAM,IAAIA,0BAAAA,qBACR,iEACF;EAGF,KAAK,SAAS,KAAK,OAAO,KAAK,IAAI;EACnC,KAAK,UAAU,KAAK,QAAQ,KAAK,IAAI;EACrC,KAAK,YAAY,KAAK,UAAU,KAAK,IAAI;CAC3C;CAEA,MAAM,OAAO,SAAkB,QAAgB;EAC7C,IAAI,CAAC,SACH,MAAM,IAAIA,0BAAAA,qBAAqB,8BAA8B;EAG/D,IAAI,CAAC,QACH,MAAM,IAAIA,0BAAAA,qBAAqB,6BAA6B;EAG9D,MAAM,QAAQ,KAAK,SAAS,OAAO;EACnC,MAAM,OAAO,MAAM,KAAK,QAAQ,OAAO;EAEvC,OAAO,MAAM,KAAK,UAAU,MAAM,QAAQ,KAAK;CACjD;CAEA,MAAM,QAAQ,SAAkB;EAC9B,MAAM,QAAQ,QAAQ,KAAK;EAC3B,MAAM,OAAO,QAAQ,KAAK;EAE1B,IAAI,CAAC,OACH,MAAM,IAAIC,0BAAAA,oBAAoB,kCAAkC;EAGlE,IAAI;EAEJ,IAAI;GACF,OAAO,MAAM,YAAY;IACvB;IACA,UAAU,KAAK;GACjB,CAAC;EACH,QAAQ;GACN,MAAM,IAAIC,0BAAAA,kBAAkB,sCAAsC;EACpE;EAEA,OAAO,MAAM,KAAK,MAAM,iBAAiB;GAAE;GAAM,GAAG;EAAK,CAAC;CAC5D;CAEA,MAAM,UAAU,MAAY,QAAgB,OAAiB;EAC3D,MAAM,iBAAiB,MAAM,KAAK,cAAc,MAAM,QAAQ,KAAK;EACnE,MAAM,cAAc,MAAM,KAAK,oBAAoB,QAAQ,MAAM,KAAK;EACtE,MAAM,eAAe,MAAM,KAAK,qBAAqB,QAAQ,MAAM,KAAK;EAIxE,MAAM,QAAe;GACnB;GACA,sBAL2B,KAAK,wBAKb;GACnB;GACA,uBAN4B,KAAK,yBAMb;GACpB,OAAO,kBAAkB,CAAC;GAC1B,MAAM,EACJ,IAAI,KAAK,GACX;GACA;EACF;EAEA,OAAO,MAAM,KAAK,MAAM,UAAU,OAAO,QAAQ,IAAI;CACvD;AACF"}