{"_id":"@arendajaelu/nestjs-passport-apple","_rev":"14-559e23824905fa112dbb1b7c61138584","name":"@arendajaelu/nestjs-passport-apple","dist-tags":{"latest":"2.1.0"},"versions":{"1.0.3":{"name":"@arendajaelu/nestjs-passport-apple","version":"1.0.3","keywords":["passport","auth","authn","authentication","authz","authorization","apple","appleid"],"author":{"url":"https://github.com/arendajaelu","name":"arendajaelu","email":"arendajaelu@gmail.com"},"license":"MIT","_id":"@arendajaelu/nestjs-passport-apple@1.0.3","maintainers":[{"name":"arendajaelu","email":"arendajaelu@gmail.com"}],"homepage":"https://github.com/arendajaelu/nestjs-passport-apple#readme","bugs":{"url":"https://github.com/arendajaelu/nestjs-passport-apple/issues"},"dist":{"shasum":"88916f90e57ebed5c22624389e0faf31afe0266f","tarball":"https://registry.npmjs.org/@arendajaelu/nestjs-passport-apple/-/nestjs-passport-apple-1.0.3.tgz","fileCount":10,"integrity":"sha512-dA6JRRKH0XbT/b1GU5YRa72cWuKvrg9YkwZwjxdMnl+adc1u+GbK7hWYXtJOHWx8N7arLPei39PyCkY6u5A09A==","signatures":[{"sig":"MEUCIQDYXCESImlY5bjUlpmO2Bg/4faOSLPYZ1HHILh6Wc0HfAIgFPXlTtsVgQ7c6i2O9QBgVhTX0Fjc+uphcuBqBKQqwqw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":19505,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi9VnBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmriIg/+LFc9XdIdptOUBE3nOQwTfDH9/477gRxKmLa6+gSWDJ8f6eUb\r\nFEe65TfyiGu8FWLJy/Kxk3x6niTCL14ZZJRl6q88C8wAyXrhLG+BaEV7aun4\r\nQPFzZgZoCAzfNz/lXpjhw3Iem9EHI0Kd2sMwB48TpEjqUjuUjPZIzgXAFGN/\r\nSmy46pNkTTStsg35dWP+N6E3Jv6mjwGFKY1Fs22Ii3fKtNKLd3x+/kvKUf1K\r\nlrNgm13o783N1+w9unSh9JHqUF1izagIabARA593vTB/j1ZWij6xMuIF6KXj\r\nhOtzBhX9RNEqTD1FEPaigcVsS6rZFiVCm72lTo77XEsVJ/aChqRDSXPpdUm7\r\nNtorkEIff1NcXAmD57lYf/oUKOtVogfaydAdcBV2+M1Uc1qpH1Jaq56pFJNK\r\nXNvnlm+YihGhjZODgiMRYMPvDGyfr3TRqvFpcyg/PWttZkmtoNC9cXkaPiWd\r\nhoWQSLYlCtZlg5Gi2Qg7pzV/KZHRLkMKkGtqtoYKgoU2eR4fyndUv4822pZT\r\npm/dZBc05NKVzRZlKm1ClIK4nW6cKaF7+7CBDJQyLdcnyF8OpfXZJaCVLoBw\r\ns7xvFMjG7lcnF5vfPstF68gG5zMW1+HYW2zAYQZnTwyMBAnizY9Q0zi8eMoe\r\nOmYv8tK16UtNIfdna1eUnt/UWf+fGxSzCSU=\r\n=qk6w\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./src","gitHead":"f0e54f7e59b7fa444c4ba07c5f932de5e8aba79c","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"arendajaelu","email":"arendajaelu@gmail.com"},"repository":{"url":"git+https://github.com/arendajaelu/nestjs-passport-apple.git","type":"git"},"_npmVersion":"8.5.5","description":"Apple strategy for Passport in Nestjs","directories":{},"_nodeVersion":"16.15.0","dependencies":{"uid2":"1.0.0","oauth":"^0.9.15","jwks-rsa":"^2.1.4","jsonwebtoken":"^8.5.1","passport-strategy":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","chai-passport-strategy":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-passport-apple_1.0.3_1660246465543_0.09653316423103475","host":"s3://npm-registry-packages"}},"1.0.4":{"name":"@arendajaelu/nestjs-passport-apple","version":"1.0.4","keywords":["passport","auth","authn","authentication","authz","authorization","apple","appleid"],"author":{"url":"https://github.com/arendajaelu","name":"arendajaelu","email":"arendajaelu@gmail.com"},"license":"MIT","_id":"@arendajaelu/nestjs-passport-apple@1.0.4","maintainers":[{"name":"arendajaelu","email":"arendajaelu@gmail.com"}],"homepage":"https://github.com/arendajaelu/nestjs-passport-apple#readme","bugs":{"url":"https://github.com/arendajaelu/nestjs-passport-apple/issues"},"dist":{"shasum":"bddbcc029cc9a338d5b0c038bb89205ec467837a","tarball":"https://registry.npmjs.org/@arendajaelu/nestjs-passport-apple/-/nestjs-passport-apple-1.0.4.tgz","fileCount":10,"integrity":"sha512-Mezik0a+yNQ/Io+hqBwofm6YqmovJQppSGzP57+gBKdq85YWF47DgxWZT55moCxccJK6d/ZtpAV8d98nsHeI+Q==","signatures":[{"sig":"MEUCIAolA+zQ3tRNuLvx6oFPfDesCRl0QEJBEXgbEG9/7eaiAiEAiEz2hU8AjrjlvgG4u4TYZoLi01k3yyhowBTeVLnSU/0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":19513,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj2l1+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqRAw/+O9BP6nFYp9EmtRQdGFhC7tuXwYQ+cUltOwOTnUN0fXW/yCFW\r\n56fzbofo2vWPCqVMYh3rRta/JCEBoAV5YhHZ8sceBtJ5ROs3cxYQhTdQceAY\r\npFJf4LLVG/0LDuDufJ3/Mt+4vbUB6BDdRSIJzuvY8HWywr1+/jb++GrWSyP9\r\n3OmTXxzVgmEsSdQL6z/Cw+YibMUYmiQTBgiufMlNIlxmAGxMRpkpooyqbif1\r\nNSDdzizCvv+FpTV6efmLrBaxZCNlXBKI1n7Q83Be6EW1Lv02eW5KKhQaM+VQ\r\nO52Yv0eGVVRZ6HtYBFPUaiRczr6oCckV95YvwtkxWjSEO8XpX+XYnqiamM5n\r\nrKYkuDaYiZpQl+PNaFXinN0gqvX14VwDV/csg4bfWdusYNULW8t0Uv88UHev\r\nLT3IZcMC22KLMqNn7vc8PuqIY/9qF1PV9q1I6fxqJL0G64ZJg38/hFfE9LR9\r\n1lZdT9VkvCBj/6UfJ8OQYorb4YcQOJKquunXi2rvXoYxFpa/HjMxu9nO1zqz\r\ntPC9Rc/Tlr0YCriT2ch+ififUvY+aHFsD1bgfXtWOiIYeTMttqfe5XecVJSC\r\nHYQ+Old2njUr1S1aLhrkkkP2ytW1eQvVI1qzXVdHPPeJzMkUdKtnqq8wykg8\r\nwZxKQxGmbgXJtCwrcgoANgDOV1y/KxhQayk=\r\n=gmy7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./src","gitHead":"1da404ad5d64f895130329d4694e57629af212e2","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"arendajaelu","email":"arendajaelu@gmail.com"},"repository":{"url":"git+https://github.com/arendajaelu/nestjs-passport-apple.git","type":"git"},"_npmVersion":"8.5.5","description":"Apple strategy for Passport in Nestjs","directories":{},"_nodeVersion":"16.15.0","dependencies":{"uid2":"1.0.0","oauth":"^0.9.15","jwks-rsa":"^2.1.4","jsonwebtoken":"^8.5.1","passport-strategy":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","chai-passport-strategy":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-passport-apple_1.0.4_1675255165803_0.5386424055775432","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"@arendajaelu/nestjs-passport-apple","version":"2.0.0","keywords":["passport","auth","authn","authentication","authz","authorization","apple","appleid"],"author":{"url":"https://github.com/arendajaelu","name":"arendajaelu","email":"arendajaelu@gmail.com"},"license":"MIT","_id":"@arendajaelu/nestjs-passport-apple@2.0.0","maintainers":[{"name":"arendajaelu","email":"arendajaelu@gmail.com"}],"homepage":"https://github.com/arendajaelu/nestjs-passport-apple#readme","bugs":{"url":"https://github.com/arendajaelu/nestjs-passport-apple/issues"},"dist":{"shasum":"8284f7c1981c3266872c7e05ef1b416b412ff7fe","tarball":"https://registry.npmjs.org/@arendajaelu/nestjs-passport-apple/-/nestjs-passport-apple-2.0.0.tgz","fileCount":11,"integrity":"sha512-nuQJ7iRXe2Doj4cybQ/542+XySGSN3G+VahHo8O/QazHGus9ujCsbPUai3ahpLJ3jY/WoJeVeOoA8B4mBCdeJw==","signatures":[{"sig":"MEUCIQD2fTVyYotObx6Knyw8FHvKORdEG3YlFBNyQxINqjWeTgIgBYkT8em8SBhumlCvrzVUO8+uRVPJYZtUfH+WrUler4o=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":22992},"main":"./src","types":"index.d.ts","gitHead":"88ebaea33206d4a80fb752fcafb43aa33372b561","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"arendajaelu","email":"arendajaelu@gmail.com"},"repository":{"url":"git+https://github.com/arendajaelu/nestjs-passport-apple.git","type":"git"},"_npmVersion":"9.5.0","description":"Apple strategy for Passport in Nestjs","directories":{},"_nodeVersion":"18.14.0","dependencies":{"uid2":"1.0.0","oauth":"^0.9.15","jwks-rsa":"^2.1.4","jsonwebtoken":"^8.5.1","passport-strategy":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","chai-passport-strategy":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-passport-apple_2.0.0_1695749499226_0.3691774912941237","host":"s3://npm-registry-packages"}},"2.0.1":{"name":"@arendajaelu/nestjs-passport-apple","version":"2.0.1","keywords":["passport","auth","authn","authentication","authz","authorization","apple","appleid"],"author":{"url":"https://github.com/arendajaelu","name":"arendajaelu","email":"arendajaelu@gmail.com"},"license":"MIT","_id":"@arendajaelu/nestjs-passport-apple@2.0.1","maintainers":[{"name":"arendajaelu","email":"arendajaelu@gmail.com"}],"homepage":"https://github.com/arendajaelu/nestjs-passport-apple#readme","bugs":{"url":"https://github.com/arendajaelu/nestjs-passport-apple/issues"},"dist":{"shasum":"1124fdcb38e1e6806b7601723b4ceb2c6d76cfde","tarball":"https://registry.npmjs.org/@arendajaelu/nestjs-passport-apple/-/nestjs-passport-apple-2.0.1.tgz","fileCount":11,"integrity":"sha512-xoXhokc4lYEzT49KJdXDCfzjGbpAadqR/ZMjwuWP8d/9E5KAbwhB4oiQQmC/yxFmsJz8f4DIBoHClafaU/0QyQ==","signatures":[{"sig":"MEUCIQCIlzR8iLNiHmk07AG0DIGP8weFzdedFJftUCvO1mmdAwIgVs5iHRmouOs2OPFktbqtI2kWc3H/MJuQQbK/Fy+5KqY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":22991},"main":"./src","types":"index.d.ts","gitHead":"5d56f8698df8cbd0e1349c018a5d27459582bfd1","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"arendajaelu","email":"arendajaelu@gmail.com"},"repository":{"url":"git+https://github.com/arendajaelu/nestjs-passport-apple.git","type":"git"},"_npmVersion":"9.5.0","description":"Apple strategy for Passport in Nestjs","directories":{},"_nodeVersion":"18.14.0","dependencies":{"uid2":"1.0.0","oauth":"^0.9.15","jwks-rsa":"^2.1.4","jsonwebtoken":"^8.5.1","passport-strategy":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","chai-passport-strategy":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-passport-apple_2.0.1_1695757253727_0.11465427204215439","host":"s3://npm-registry-packages"}},"2.0.2":{"name":"@arendajaelu/nestjs-passport-apple","version":"2.0.2","keywords":["passport","auth","authn","authentication","authz","authorization","apple","appleid"],"author":{"url":"https://github.com/arendajaelu","name":"arendajaelu","email":"arendajaelu@gmail.com"},"license":"MIT","_id":"@arendajaelu/nestjs-passport-apple@2.0.2","maintainers":[{"name":"arendajaelu","email":"arendajaelu@gmail.com"}],"homepage":"https://github.com/arendajaelu/nestjs-passport-apple#readme","bugs":{"url":"https://github.com/arendajaelu/nestjs-passport-apple/issues"},"dist":{"shasum":"119770eda0a6573796ce82474c72c87747855699","tarball":"https://registry.npmjs.org/@arendajaelu/nestjs-passport-apple/-/nestjs-passport-apple-2.0.2.tgz","fileCount":11,"integrity":"sha512-meOso06geVRq+0trNEiqi8ZXH6D6ZpDTS0kpyeIlSeGdiKVthHrMM7yTBiSLKS4kxmdrnAiEXfyeYZiZxXTh1A==","signatures":[{"sig":"MEYCIQDXZIiLOq2aI/2AuiYtQwXI6SbH9CTpL22GX7+9YiHwNwIhAPo0tp2iQUXRRRttQoBGGfHQETSnG0FHOAtJWtwRsQTi","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":22983},"main":"./src","types":"index.d.ts","gitHead":"b4398ae567d78bb5ba3802a3ed6b20d0a5490df3","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"arendajaelu","email":"arendajaelu@gmail.com"},"repository":{"url":"git+https://github.com/arendajaelu/nestjs-passport-apple.git","type":"git"},"_npmVersion":"9.5.0","description":"Apple strategy for Passport in Nestjs","directories":{},"_nodeVersion":"18.14.0","dependencies":{"uid2":"1.0.0","oauth":"^0.9.15","jwks-rsa":"^2.1.4","jsonwebtoken":"^8.5.1","passport-strategy":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","chai-passport-strategy":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-passport-apple_2.0.2_1701617776624_0.7286513799128838","host":"s3://npm-registry-packages"}},"2.0.3":{"name":"@arendajaelu/nestjs-passport-apple","version":"2.0.3","keywords":["passport","auth","authn","authentication","authz","authorization","apple","appleid"],"author":{"url":"https://github.com/arendajaelu","name":"arendajaelu","email":"arendajaelu@gmail.com"},"license":"MIT","_id":"@arendajaelu/nestjs-passport-apple@2.0.3","maintainers":[{"name":"arendajaelu","email":"arendajaelu@gmail.com"}],"homepage":"https://github.com/arendajaelu/nestjs-passport-apple#readme","bugs":{"url":"https://github.com/arendajaelu/nestjs-passport-apple/issues"},"dist":{"shasum":"b76e060b390961d743049b8e196ffd602d8526bd","tarball":"https://registry.npmjs.org/@arendajaelu/nestjs-passport-apple/-/nestjs-passport-apple-2.0.3.tgz","fileCount":11,"integrity":"sha512-AkljlHZdXmMC8V6xqdxHmyzbu9bzEjbD7efQmGwnmxBSuLwndTUz7n5UC2vwjKBnCOqKg26eLY3pXfK1u7qtoQ==","signatures":[{"sig":"MEYCIQCOnmwv9q6RZAnj/Xrh573SA1eEgRra51ccRStyJZkrZQIhAKStkL51EAQwXTH6sKA3zHkrbJg5+Jiu+/8vciPlICou","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":22983},"main":"./src","types":"index.d.ts","gitHead":"99776b95e05a829c56e9c73cb7e7774df32577a1","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"arendajaelu","email":"arendajaelu@gmail.com"},"repository":{"url":"git+https://github.com/arendajaelu/nestjs-passport-apple.git","type":"git"},"_npmVersion":"9.5.0","description":"Apple strategy for Passport in Nestjs","directories":{},"_nodeVersion":"18.14.0","dependencies":{"uid2":"1.0.0","oauth":"^0.9.15","jwks-rsa":"^2.1.4","jsonwebtoken":"^9.0.2","passport-strategy":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","chai-passport-strategy":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-passport-apple_2.0.3_1721033580121_0.7384292062574025","host":"s3://npm-registry-packages"}},"2.0.4":{"name":"@arendajaelu/nestjs-passport-apple","version":"2.0.4","keywords":["passport","auth","authn","authentication","authz","authorization","apple","appleid"],"author":{"url":"https://github.com/arendajaelu","name":"arendajaelu","email":"arendajaelu@gmail.com"},"license":"MIT","_id":"@arendajaelu/nestjs-passport-apple@2.0.4","maintainers":[{"name":"arendajaelu","email":"arendajaelu@gmail.com"}],"homepage":"https://github.com/arendajaelu/nestjs-passport-apple#readme","bugs":{"url":"https://github.com/arendajaelu/nestjs-passport-apple/issues"},"dist":{"shasum":"180fe7c7382c35a68f04254ad2432c87c3b35ee5","tarball":"https://registry.npmjs.org/@arendajaelu/nestjs-passport-apple/-/nestjs-passport-apple-2.0.4.tgz","fileCount":11,"integrity":"sha512-NvDjmUK6IrZb7O2Ujrp1lt733lf4jeqlt3L421bc44tQvHQ414y7qtO0da7kh8/p6NbD2wySc1PWL042lEBbbw==","signatures":[{"sig":"MEQCIGiQ9PMAWQmK3EwGw9rrtSIoZyULFdtAN2LrHdOOQmhEAiAfhNAHqF3++vwxF0JcPfDf4/ngafoF9+3URi0nPiQ1Sg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22322},"main":"./src","types":"index.d.ts","gitHead":"a41a946f4fc8312a1e45e4d4a77dcbcefcaabea0","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"arendajaelu","email":"arendajaelu@gmail.com"},"repository":{"url":"git+https://github.com/arendajaelu/nestjs-passport-apple.git","type":"git"},"_npmVersion":"10.9.0","description":"Apple strategy for Passport in Nestjs","directories":{},"_nodeVersion":"23.1.0","dependencies":{"uid2":"1.0.0","oauth":"^0.9.15","jwks-rsa":"^2.1.4","jsonwebtoken":"^9.0.2","passport-strategy":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","chai-passport-strategy":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-passport-apple_2.0.4_1738818465279_0.3137571178028906","host":"s3://npm-registry-packages-npm-production"}},"2.0.5":{"name":"@arendajaelu/nestjs-passport-apple","version":"2.0.5","keywords":["passport","auth","authn","authentication","authz","authorization","apple","appleid"],"author":{"url":"https://github.com/arendajaelu","name":"arendajaelu","email":"arendajaelu@gmail.com"},"license":"MIT","_id":"@arendajaelu/nestjs-passport-apple@2.0.5","maintainers":[{"name":"arendajaelu","email":"arendajaelu@gmail.com"}],"homepage":"https://github.com/arendajaelu/nestjs-passport-apple#readme","bugs":{"url":"https://github.com/arendajaelu/nestjs-passport-apple/issues"},"dist":{"shasum":"8723a6b69377a2d0ed442462caf410da170fc452","tarball":"https://registry.npmjs.org/@arendajaelu/nestjs-passport-apple/-/nestjs-passport-apple-2.0.5.tgz","fileCount":11,"integrity":"sha512-GVVl3al6Z+DBRl+yW7yZypEpeqi/NBNOqCpHInJoSpKkmHqQfBrAhVTFkrM0OLVdubuof9lSGYyL5wI4W9VH7A==","signatures":[{"sig":"MEUCIQDz7R4bYgbgLFDUFCMoZURPr4qd/GHl7prgqJXVRihn5wIgXZwxoZ3d3p7t0BCHYTKKZvopDxU+z4/5TdZizuSUxi0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22697},"main":"./src","types":"index.d.ts","gitHead":"af4d6973b9bb485fad11b94f2ed51f4e232f5137","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"arendajaelu","email":"arendajaelu@gmail.com"},"repository":{"url":"git+https://github.com/arendajaelu/nestjs-passport-apple.git","type":"git"},"_npmVersion":"10.9.0","description":"Apple strategy for Passport in Nestjs","directories":{},"_nodeVersion":"23.1.0","dependencies":{"uid2":"1.0.0","oauth":"^0.9.15","jwks-rsa":"^2.1.4","jsonwebtoken":"^9.0.2","passport-strategy":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","chai-passport-strategy":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-passport-apple_2.0.5_1738871223334_0.7138014944783875","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@arendajaelu/nestjs-passport-apple","version":"2.1.0","description":"Apple strategy for Passport in Nestjs","keywords":["nestjs","passport","passport-apple","sign-in-with-apple","apple-login","apple-oauth","oauth2","auth","authn","authentication","authz","authorization","apple","appleid","apple-signin","token-revocation"],"main":"./src/index.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","default":"./src/index.js"}},"engines":{"node":">=18.0.0"},"scripts":{"test":"node --test test/strategy.test.js test/integration.test.js","prepublishOnly":"npm run lint && npm test && npm run typecheck","lint":"eslint src test/*.test.js","typecheck":"tsc --noEmit --strict index.d.ts","test:types":"sh scripts/test-types.sh"},"devDependencies":{"@eslint/js":"^9.0.0","eslint":"^9.0.0","typescript":"^5.5.0"},"author":{"name":"arendajaelu","email":"arendajaelu@gmail.com","url":"https://github.com/arendajaelu"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/arendajaelu/nestjs-passport-apple.git"},"dependencies":{"jsonwebtoken":"^9.0.2","jwks-rsa":"^2.1.4","oauth":"^0.9.15","passport-strategy":"^1.0.0"},"_id":"@arendajaelu/nestjs-passport-apple@2.1.0","gitHead":"07e5fd54d3f97b12273358a02fdb5f06bd58eb33","bugs":{"url":"https://github.com/arendajaelu/nestjs-passport-apple/issues"},"homepage":"https://github.com/arendajaelu/nestjs-passport-apple#readme","_nodeVersion":"22.17.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-mKosMncn+M7f5Dm6yz1zFt27UHuRBLxCShmeBI3vpR4kNrDJReSdO41WAwfmI7EF6L2sdRFpBZTSsvjv01k9DQ==","shasum":"bab2739d92907de0d7d3914b579751f96213f187","tarball":"https://registry.npmjs.org/@arendajaelu/nestjs-passport-apple/-/nestjs-passport-apple-2.1.0.tgz","fileCount":11,"unpackedSize":47975,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDRdSQWXhY/cquF5akauUBf0tkASBoE4ehNsSOptkwckgIhAMMRRBP2uvt4yL5e2rUBqZpPXh3KZN8NG8wpF52NTdzw"}]},"_npmUser":{"name":"arendajaelu","email":"arendajaelu@gmail.com"},"directories":{},"maintainers":[{"name":"arendajaelu","email":"arendajaelu@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nestjs-passport-apple_2.1.0_1784720784324_0.4779899134042618"},"_hasShrinkwrap":false}},"time":{"created":"2022-08-11T19:34:25.474Z","modified":"2026-07-22T11:46:24.651Z","1.0.0":"2022-08-11T19:24:04.234Z","1.0.1":"2022-08-11T19:27:46.280Z","1.0.2":"2022-08-11T19:30:03.952Z","1.0.3":"2022-08-11T19:34:25.738Z","1.0.4":"2023-02-01T12:39:25.983Z","2.0.0":"2023-09-26T17:31:39.435Z","2.0.1":"2023-09-26T19:40:53.910Z","2.0.2":"2023-12-03T15:36:16.796Z","2.0.3":"2024-07-15T08:53:00.275Z","2.0.4":"2025-02-06T05:07:45.536Z","2.0.5":"2025-02-06T19:47:03.517Z","2.1.0":"2026-07-22T11:46:24.472Z"},"bugs":{"url":"https://github.com/arendajaelu/nestjs-passport-apple/issues"},"author":{"name":"arendajaelu","email":"arendajaelu@gmail.com","url":"https://github.com/arendajaelu"},"license":"MIT","homepage":"https://github.com/arendajaelu/nestjs-passport-apple#readme","keywords":["nestjs","passport","passport-apple","sign-in-with-apple","apple-login","apple-oauth","oauth2","auth","authn","authentication","authz","authorization","apple","appleid","apple-signin","token-revocation"],"repository":{"type":"git","url":"git+https://github.com/arendajaelu/nestjs-passport-apple.git"},"description":"Apple strategy for Passport in Nestjs","maintainers":[{"name":"arendajaelu","email":"arendajaelu@gmail.com"}],"readme":"# NestJS Passport Apple Strategy — Sign in with Apple for NestJS\n\n[![npm version](https://img.shields.io/npm/v/@arendajaelu/nestjs-passport-apple.svg)](https://www.npmjs.com/package/@arendajaelu/nestjs-passport-apple)\n[![npm downloads](https://img.shields.io/npm/dt/@arendajaelu/nestjs-passport-apple.svg)](https://www.npmjs.com/package/@arendajaelu/nestjs-passport-apple)\n[![license](https://img.shields.io/npm/l/@arendajaelu/nestjs-passport-apple.svg)](./LICENSE)\n[![node](https://img.shields.io/node/v/@arendajaelu/nestjs-passport-apple.svg)](https://nodejs.org)\n[![CI](https://github.com/arendajaelu/nestjs-passport-apple/actions/workflows/ci.yml/badge.svg)](https://github.com/arendajaelu/nestjs-passport-apple/actions/workflows/ci.yml)\n\n**Apple login for NestJS in minutes.** A Passport strategy that integrates **Sign in with Apple** into NestJS applications — Apple OAuth 2.0 authentication, identity token (JWT) verification, refresh token validation, token revocation for account deletion, and Apple's server-to-server notifications, all in one typed, tested package with **900k+ downloads**.\n\nWorks with `@nestjs/passport` and `AuthGuard`, supports web apps (Services ID) and native iOS/macOS apps (App ID), and verifies every token against Apple's public keys before your code ever sees it.\n\n## Features\n\n- 🍎 **Plug-and-play Apple login** — works with NestJS 10 & 11 via `AuthGuard`\n- 🔐 **Verified before you see it** — ID tokens are checked against Apple's public keys; your `validate` only receives trusted data\n- 🧾 **Typed `Profile`** — email, verification status, and Hide My Email flag included\n- 📱 **Native app support** — verify identity tokens from iOS/macOS apps, with nonce protection (`verifyIdToken`)\n- ♻️ **Session validation** — check that a user's Apple authorization is still alive (`refreshAccessToken`)\n- 🗑️ **Account deletion ready** — revoke tokens per App Store Guideline 5.1.1(v) (`revokeToken`)\n- 📨 **Server-to-server notifications** — verify Apple's signed account events (`verifyServerNotification`)\n- 🛡️ **CSRF protection** — optional OAuth `state` generation and validation\n- ✅ **Fully tested** — unit and integration suites run the complete flow against a mock Apple server, and published types are compiled by a real strict-mode NestJS consumer in CI\n\n## Requirements\n\n- Node.js 18 or later when used with NestJS 10\n- Node.js 20 or later when used with NestJS 11 (NestJS 11 itself requires Node.js 20)\n\n## Installation\n\n```bash\nnpm install @arendajaelu/nestjs-passport-apple\n```\n\n## Usage\n\n### Strategy Setup\n\nThe following example shows all commonly used options:\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { AuthGuard, PassportStrategy } from '@nestjs/passport';\nimport { Strategy, Profile } from '@arendajaelu/nestjs-passport-apple';\n\nconst APPLE_STRATEGY_NAME = 'apple';\n\n@Injectable()\nexport class AppleStrategy extends PassportStrategy(Strategy, APPLE_STRATEGY_NAME) {\n  constructor() {\n    super({\n      clientID: process.env.APPLE_OAUTH_CLIENT_ID,\n      teamID: process.env.APPLE_TEAMID,\n      keyID: process.env.APPLE_KEYID,\n      key: process.env.APPLE_KEY_CONTENTS,\n      // OR\n      keyFilePath: process.env.APPLE_KEYFILE_PATH,\n      callbackURL: process.env.APPLE_OAUTH_CALLBACK_URL,\n      scope: ['email', 'name'],\n      // state: true, // recommended in production for CSRF protection; requires express-session\n      passReqToCallback: false,\n    });\n  }\n\n  async validate(_accessToken: string, _refreshToken: string, profile: Profile) {\n    return {\n      emailAddress: profile.email,\n      firstName: profile.name?.firstName || '',\n      lastName: profile.name?.lastName || '',\n    };\n  }\n}\n\n@Injectable()\nexport class AppleOAuthGuard extends AuthGuard(APPLE_STRATEGY_NAME) {}\n```\n\n> **Note**: Register `AppleStrategy` in the `providers` array of your module.\n\n### Controller Endpoints\n\n```typescript\nimport { Controller, Get, Post, Req, UseGuards } from '@nestjs/common';\nimport { ApiTags } from '@nestjs/swagger';\nimport { AppleOAuthGuard } from './strategies/apple.strategy';\n\n@ApiTags('oauth')\n@Controller('oauth')\nexport class OAuthController {\n  @Get('apple')\n  @UseGuards(AppleOAuthGuard)\n  async appleLogin() {}\n\n  @Post('apple/callback')\n  @UseGuards(AppleOAuthGuard)\n  async appleCallback(@Req() req) {\n    return req.user;\n  }\n}\n```\n\n> Apple delivers the authorization callback as an `application/x-www-form-urlencoded` HTTP POST whenever scopes such as `name` or `email` are requested (the strategy always sends `response_mode=form_post`). The callback route must therefore be a `@Post` handler with URL-encoded body parsing enabled — NestJS enables this by default. The callback URL must exactly match an HTTPS return URL registered in the Apple Developer portal; Apple does not accept `localhost` or IP-address callback URLs. Authorization codes are single-use and expire after five minutes.\n\n### Strategy Options\n\n| Option | Required | Description |\n|---|---|---|\n| `clientID` | Yes | Apple Services ID (or App ID) used as the OAuth client identifier |\n| `teamID` | Yes | Apple Developer Team ID |\n| `keyID` | Yes | Identifier of the Sign in with Apple private key |\n| `key` | Yes* | Contents of the private key. Provide either `key` or `keyFilePath` |\n| `keyFilePath` | Yes* | Path to the private key file; loaded with `fs.readFileSync` |\n| `callbackURL` | No | OAuth redirect URI; must match a return URL registered with Apple |\n| `scope` | No | Array of scopes, e.g. `['email', 'name']` |\n| `state` | No | Enables OAuth `state` generation and validation to protect against CSRF: a random value is stored in the session before redirecting to Apple and compared with the value Apple posts back. Strongly recommended in production. Requires `express-session` or compatible session middleware. Defaults to `false` |\n| `store` | No | Custom state store implementing `store(req, callback)` and `verify(req, state, callback)`, for deployments without session middleware |\n| `sessionKey` | No | Session key under which state is stored; defaults to `apple:<hostname>` |\n| `passReqToCallback` | No | Passes the request as the first argument of `validate`; defaults to `false` |\n| `clientSecretExpiry` | No | Lifetime of the generated client secret JWT; defaults to `'5 minutes'`. Secrets are cached and regenerated automatically before expiry |\n| `authorizationURL` | No | Defaults to `https://appleid.apple.com/auth/authorize` |\n| `tokenURL` | No | Defaults to `https://appleid.apple.com/auth/token` |\n| `revokeURL` | No | Defaults to `https://appleid.apple.com/auth/revoke` |\n| `jwksURL` | No | JWKS endpoint used to fetch Apple's public keys; defaults to `https://appleid.apple.com/auth/keys` |\n\n### Validate Callback\n\nAfter successful authentication, `validate` receives the `accessToken`, `refreshToken`, and verified `profile`. The value it returns becomes `req.user`. Store the `refreshToken` if you intend to validate sessions or revoke access later.\n\n### Profile Object\n\n```typescript\n{\n  id: string;               // stable Apple user identifier (the `sub` claim)\n  provider: 'apple';\n  email?: string;\n  emailVerified?: boolean;\n  isPrivateEmail?: boolean; // true when the address is a Hide My Email relay\n  name?: {                  // present only on the user's first authorization\n    firstName: string;\n    lastName: string;\n  };\n}\n```\n\n> **Important**: Always associate application accounts with `profile.id`, not the email address. Apple posts the `user` object (containing `name`) only during the user's **first** authorization — persist it at that point. Because the name originates from the browser form post rather than from the signed identity token, validate and sanitize it before storing or displaying it. Subsequent authorizations do not include the `user` object; the identity token normally carries the email claim, but applications should tolerate a missing email as well (some managed Apple Accounts have none).\n\n### Private Relay Email Addresses\n\nDo not identify or filter Apple relay addresses by inspecting the email domain; rely on the verified `isPrivateEmail` flag instead. If your email validation or delivery infrastructure filters by domain, it must accept all of Apple's relay domains: `private.icloud.com` (used for addresses generated from mid-2026 onward) as well as the legacy `privaterelay.appleid.com` and `icloud.com`.\n\n## Beyond Login\n\nThe strategy instance exposes the remaining Sign in with Apple lifecycle operations. Because the strategy is a NestJS provider, it can be injected wherever these operations are needed.\n\n### Verifying a Native App's Identity Token\n\nWhen your backend also serves an iOS/macOS application using `ASAuthorizationAppleIDCredential`, the app submits an identity token directly. Verify it against Apple's public keys:\n\n```typescript\nconst claims = await appleStrategy.verifyIdToken(identityToken, {\n  audience: 'com.example.bundleid', // the app's bundle ID, from server-side configuration\n  nonce: expectedNonce,             // the nonce your server issued for this sign-in attempt\n});\n// claims.sub is the stable Apple user identifier\n```\n\n- `audience` defaults to the configured `clientID`; override it when the token was issued for a different client, such as the app's bundle ID.\n- When a `nonce` is supplied, verification fails unless the token's nonce claim matches exactly. Apple requires nonce validation whenever a nonce is used, as protection against replay attacks.\n\n> **Security**: The expected `audience` and `nonce` must come from trusted server-side configuration or server-side session state. Never accept either value from the untrusted request being authenticated.\n\n### Validating a Refresh Token and Obtaining New Tokens\n\n```typescript\nconst tokens = await appleStrategy.refreshAccessToken(refreshToken);\n// tokens: { access_token, token_type, expires_in, id_token }\n```\n\nApple recommends validating a stored refresh token no more than once per day; more frequent validation risks throttling. An `invalid_grant` error means the authorization code or refresh token is invalid, expired, already consumed, revoked, or does not match the configured client — in all cases, the application should require the user to authenticate again.\n\n### Revoking Tokens (Account Deletion)\n\nApp Store Review Guideline 5.1.1(v) requires applications that offer account creation to also offer account deletion, including revocation of Sign in with Apple tokens:\n\n```typescript\nawait appleStrategy.revokeToken(refreshToken); // token_type_hint defaults to 'refresh_token'\n// or\nawait appleStrategy.revokeToken(accessToken, 'access_token');\n```\n\nA successful call revokes the token and its associated Sign in with Apple authorization, or confirms that the token was already invalid — Apple returns HTTP 200 in both cases.\n\n> **Note**: Revoking the Apple token does not delete the application account or terminate the application's own sessions. After revocation, the application remains responsible for deleting applicable user data, removing stored tokens, clearing local sessions and cookies, and returning the client to an unauthenticated state.\n\n### Processing Server-to-Server Notifications\n\nApple can notify your server when users change their relationship with your application. Register a notification endpoint URL in the Apple Developer portal; Apple then delivers signed events as an HTTP POST with a JSON body of the form `{ \"payload\": \"<signed JWS>\" }`. Verify the signature before acting on any event:\n\n```typescript\n@Post('apple/notifications')\nasync appleNotifications(@Body() body: { payload: string }) {\n  const notification = await this.appleStrategy.verifyServerNotification(body.payload);\n\n  switch (notification.events.type) {\n    case 'email-enabled':   // user enabled email forwarding\n    case 'email-disabled':  // user disabled email forwarding\n      break;\n    case 'consent-revoked': // user revoked authorization — end their sessions\n      break;\n    case 'account-deleted': // user deleted their Apple Account — remove associated data\n      break;\n  }\n}\n```\n\n`verifyServerNotification` validates the JWS signature against Apple's public keys, along with the issuer and audience, and returns the claims with the `events` payload parsed. The library performs verification only; deciding how to act on each event remains the application's responsibility. Verification failures throw — treat such requests as forged and reject them.\n\n> **Replay protection**: a verified notification carries a `jti` (unique notification ID). Because a captured delivery could be replayed to your endpoint while still within its validity window, persist processed `jti` values (database, Redis, etc.) and reject duplicates before acting on an event:\n>\n> ```typescript\n> const accepted = await this.notificationStore.claim(notification.jti);\n> if (!accepted) {\n>   throw new ConflictException('Notification already processed');\n> }\n> ```\n\n### TypeScript: Request Typing\n\nThe strategy's type declarations are fully self-contained — no `@types/express` or `@types/passport-strategy` required. The request type is generic, so `passReqToCallback` and custom state stores work with any HTTP framework's request type:\n\n```typescript\nimport type { Request } from 'express'; // or FastifyRequest from 'fastify'\n\nexport class AppleStrategy extends PassportStrategy(Strategy<Request>, 'apple') {\n  constructor() {\n    super({ /* options */, passReqToCallback: true });\n  }\n\n  validate(req: Request, accessToken: string, refreshToken: string, profile: Profile) {\n    return { id: profile.id };\n  }\n}\n```\n\n## Testing\n\nThe repository ships with a comprehensive automated test suite built on the Node.js native test runner — no additional test dependencies are required:\n\n```bash\nnpm test\n```\n\nThe suite covers two levels:\n\n- **Unit tests** (`test/strategy.test.js`): constructor validation, authorization redirect parameters, Apple error handling, profile claim parsing (including the string and boolean forms of `email_verified` and `is_private_email`), revocation and refresh request formats, client secret generation, expiry-driven regeneration, per-client secret caching, and state store behavior (session-based validation, mismatch rejection, and custom stores).\n- **Integration tests** (`test/integration.test.js`): the complete authentication flow executed against a local mock of Apple's token and JWKS endpoints with genuine RS256-signed identity tokens, along with negative cases — wrong audience, unknown signing key, expired tokens, nonce mismatches, and forged server notifications.\n\n## Tutorials\n\nFor a complete, up-to-date walkthrough covering authentication, token revocation, and the full Sign in with Apple lifecycle:\n\n[**Apple Login with NestJS in 2026–2027: A Complete Guide to Authentication, Token Revocation and More**](https://medium.com/@joosepwong/apple-login-with-nestjs-in-2026-2027-a-complete-guide-to-authentication-token-revocation-and-9ec3f08863e5)\n\nThe original walkthrough of the Apple Developer portal setup is also available:\n\n[**How to Implement Apple Login with NestJS in Seconds**](https://blog.devgenius.io/how-to-implement-apple-login-with-nestjs-in-seconds-b88f05abe847)\n\n## FAQ\n\n### How do I implement Apple login in NestJS?\n\nInstall this package, register the strategy shown in [Strategy Setup](#strategy-setup) as a NestJS provider, and guard your routes with `AuthGuard('apple')`. The [complete guide](https://medium.com/@joosepwong/apple-login-with-nestjs-in-2026-2027-a-complete-guide-to-authentication-token-revocation-and-9ec3f08863e5) walks through every step, including the Apple Developer portal configuration.\n\n### How do I verify an Apple identity token from an iOS app on my NestJS backend?\n\nUse [`verifyIdToken`](#verifying-a-native-apps-identity-token) with your app's bundle ID as the audience. It validates the RS256 signature against Apple's JWKS, plus issuer, expiry, and (optionally) nonce.\n\n### How do I revoke Sign in with Apple tokens for account deletion?\n\nCall [`revokeToken`](#revoking-tokens-account-deletion) with the user's stored refresh token. This satisfies App Store Review Guideline 5.1.1(v), which requires apps offering account creation to also revoke Apple tokens on account deletion.\n\n### Why is the user's name missing after the first Apple login?\n\nApple sends the `name` (and the `user` object) only on the user's **first** authorization. Persist it on first login — see [Profile Object](#profile-object).\n\n### Does this work with the new `private.icloud.com` Hide My Email addresses?\n\nYes. The strategy exposes a verified `isPrivateEmail` flag, so you never need to match relay domains yourself — see [Private Relay Email Addresses](#private-relay-email-addresses).\n\n### Can my server get notified when a user revokes access or deletes their Apple Account?\n\nYes — register a notification endpoint with Apple and verify each event with [`verifyServerNotification`](#processing-server-to-server-notifications).\n\n## License\n\nLicensed under [MIT](./LICENSE).\n\n---\n\n*Keywords: Sign in with Apple, Apple login NestJS, NestJS Apple OAuth, passport-apple, Apple OAuth2 strategy, apple-signin, Apple ID authentication, verify Apple identity token, Apple token revocation, Apple server-to-server notifications, Hide My Email, NestJS authentication, Passport.js Apple strategy*\n","readmeFilename":"README.md"}