{"_id":"@remix-run/auth","_rev":"14-d9b7931dcf339bd650a5fdb1e14f861e","name":"@remix-run/auth","dist-tags":{"latest":"0.3.2"},"versions":{"0.0.0":{"name":"@remix-run/auth","version":"0.0.0","license":"MIT","_id":"@remix-run/auth@0.0.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"3b536aaf64f7620adaef84838ead5e601c907cac","tarball":"https://registry.npmjs.org/@remix-run/auth/-/auth-0.0.0.tgz","fileCount":2,"integrity":"sha512-NowKBaAWeMU6kjrgy6A0bnCtAllmCAGskusHCypvBhNsqpTWFCXlUB0UTtMBQSDvKAh378OfeZNwyCJDw2bnmg==","signatures":[{"sig":"MEQCIEW+5l3U8yw0Ifi5DwmfdIhWLnbxN6SDd924qQsuvdTLAiA3dGAAYd2ZaQXHkhvG+vnzwEZRcyEPMCQn3bqalp65iw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":455},"_npmUser":{"name":"mjackson","email":"mjijackson+npm@gmail.com"},"repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/auth"},"_npmVersion":"11.9.0","description":"Placeholder package for Remix CI/OIDC setup","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/auth_0.0.0_1773883782050_0.7228464230350091","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@remix-run/auth","version":"0.1.0","keywords":["auth","authentication","oauth","oidc","google","github","facebook","x","microsoft","okta","auth0","login","credentials","session"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/auth@0.1.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/auth#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"712ee9283d93b81f1816870762d87aa6257f2cc9","tarball":"https://registry.npmjs.org/@remix-run/auth/-/auth-0.1.0.tgz","fileCount":71,"integrity":"sha512-TFsK40jymT7iZyGWOjoqlFFmILdDXy3jYBoI1mohjdqrp8SVWbm7htiSbdd+j8DGBUEbxMTvKcaVG0bPA1M8VA==","signatures":[{"sig":"MEUCIE7n7NFB+oPGefs03GcfQvhaGI3b/VvFaV5fk4rnAdWaAiEAh0/HPbAGqKmppovOloJFDRpMz55d+e0U3aIn5skSUH0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fauth@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":151727},"type":"module","_from":"file:remix-run-auth-0.1.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8e44cdde-a882-4bf8-bab3-12b1a877a11b"}},"_resolved":"/tmp/24083fa0f545a09e30f3fcaa1dad7216/remix-run-auth-0.1.0.tgz","_integrity":"sha512-TFsK40jymT7iZyGWOjoqlFFmILdDXy3jYBoI1mohjdqrp8SVWbm7htiSbdd+j8DGBUEbxMTvKcaVG0bPA1M8VA==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/auth"},"_npmVersion":"11.9.0","description":"Browser login, OAuth, and OIDC helpers for Remix","directories":{},"_nodeVersion":"24.14.0","dependencies":{"@remix-run/session":"^0.4.1","@remix-run/fetch-router":"^0.18.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/cookie":"0.5.1","@remix-run/headers":"0.19.0","@remix-run/session":"0.4.1","@remix-run/fetch-router":"0.18.0","@remix-run/auth-middleware":"0.1.0","@typescript/native-preview":"7.0.0-dev.20251125.1","@remix-run/session-middleware":"0.2.0","@remix-run/form-data-middleware":"0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/auth_0.1.0_1774479870269_0.33255250491539035","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@remix-run/auth","version":"0.1.1","keywords":["auth","authentication","oauth","oidc","google","github","facebook","x","microsoft","okta","auth0","login","credentials","session"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/auth@0.1.1","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/auth#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"72c34b7d71637b0ceeae287d8774812e96dd002d","tarball":"https://registry.npmjs.org/@remix-run/auth/-/auth-0.1.1.tgz","fileCount":71,"integrity":"sha512-lpbkwq3E6AHBVXVPCHD14wvFLnTVL9i6iMuTS2paebfkg8ZbfoClCbOvusyYDObWRGYE5m74HJK8YTsT4axPAg==","signatures":[{"sig":"MEYCIQC26wTXbiLMeY0fY2ILtUEaJOErFeq15g88fwf7pCEQEQIhAKgY32FrAuJFBWuZ9zOky334wydjqRAe0JvWNPktvW/r","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fauth@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":151754},"type":"module","_from":"file:remix-run-auth-0.1.1.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"remix-test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8e44cdde-a882-4bf8-bab3-12b1a877a11b"}},"_resolved":"/tmp/6203190ba79f1b2165b4fed86a389726/remix-run-auth-0.1.1.tgz","_integrity":"sha512-lpbkwq3E6AHBVXVPCHD14wvFLnTVL9i6iMuTS2paebfkg8ZbfoClCbOvusyYDObWRGYE5m74HJK8YTsT4axPAg==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/auth"},"_npmVersion":"11.12.1","description":"Browser login, OAuth, and OIDC helpers for Remix","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@remix-run/session":"^0.4.1","@remix-run/fetch-router":"^0.18.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/test":"0.1.0","@remix-run/assert":"0.1.0","@remix-run/cookie":"0.5.1","@remix-run/headers":"0.19.0","@remix-run/session":"0.4.1","@remix-run/fetch-router":"0.18.1","@remix-run/auth-middleware":"0.1.1","@typescript/native-preview":"7.0.0-dev.20251125.1","@remix-run/session-middleware":"0.2.1","@remix-run/form-data-middleware":"0.2.1"},"_npmOperationalInternal":{"tmp":"tmp/auth_0.1.1_1776904688709_0.45838058302362983","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@remix-run/auth","version":"0.2.0","keywords":["auth","authentication","oauth","oidc","atproto","bluesky","google","github","facebook","x","microsoft","okta","auth0","login","credentials","session"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/auth@0.2.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/auth#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"f087e4daf345d81d2281ab5662e86900dde46d78","tarball":"https://registry.npmjs.org/@remix-run/auth/-/auth-0.2.0.tgz","fileCount":79,"integrity":"sha512-sdjH4MUEOLundh37V0exO0nwFATjOKrBRKyK9xogOYTSddiXxij1WYuhdd2Xhsv+q5uMA83BVUhhN2heUE8l7w==","signatures":[{"sig":"MEQCIEQcWgvpF2V30rbuf92d9EZf0ZtVxlV85NmqR1XQ9uQdAiAlFWOVXCDrROfYmozyueJ1Ti4H87S9UWpSgSCvGQrDaA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fauth@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":263521},"type":"module","_from":"file:remix-run-auth-0.2.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"remix-test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix-test","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8e44cdde-a882-4bf8-bab3-12b1a877a11b"}},"_resolved":"/tmp/750dd5af9b60ba6508c8eb9d4786108d/remix-run-auth-0.2.0.tgz","_integrity":"sha512-sdjH4MUEOLundh37V0exO0nwFATjOKrBRKyK9xogOYTSddiXxij1WYuhdd2Xhsv+q5uMA83BVUhhN2heUE8l7w==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/auth"},"_npmVersion":"11.11.0","description":"Browser login, OAuth, and OIDC helpers for Remix","directories":{},"_nodeVersion":"24.14.1","dependencies":{"@remix-run/session":"^0.4.1","@remix-run/fetch-router":"^0.18.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/test":"0.2.0","@remix-run/assert":"0.1.0","@remix-run/cookie":"0.5.1","@remix-run/headers":"0.19.0","@remix-run/session":"0.4.1","@remix-run/fetch-router":"0.18.1","@remix-run/auth-middleware":"0.1.1","@typescript/native-preview":"7.0.0-dev.20251125.1","@remix-run/session-middleware":"0.2.1","@remix-run/form-data-middleware":"0.2.2"},"_npmOperationalInternal":{"tmp":"tmp/auth_0.2.0_1777483830677_0.8744498300588592","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@remix-run/auth","version":"0.2.1","keywords":["auth","authentication","oauth","oidc","atproto","bluesky","google","github","facebook","x","microsoft","okta","auth0","login","credentials","session"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/auth@0.2.1","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/auth#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"15f6618c07cd3acc489c588cdc8191c41b0381d6","tarball":"https://registry.npmjs.org/@remix-run/auth/-/auth-0.2.1.tgz","fileCount":79,"integrity":"sha512-KGX1y1h7eZiCVU204Z9NZhOjV+zhF4wktm5gOuiUoVN95oYTh9BFEEIsyGQdxHhxTH31hWUNNh2Aj5dCrr/u6Q==","signatures":[{"sig":"MEUCIBN+AhMvRUahXtvfB+/5g9plSGzKMDfghNIgohiUwzBQAiEA8cOF9DTShazSPQVwB77GbiWITG7WigJBzm2c3AqY5Qc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fauth@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":263521},"type":"module","_from":"file:remix-run-auth-0.2.1.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"remix-test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix-test","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8e44cdde-a882-4bf8-bab3-12b1a877a11b"}},"_resolved":"/tmp/876207efbf736cb4f4ea84fa514ac68b/remix-run-auth-0.2.1.tgz","_integrity":"sha512-KGX1y1h7eZiCVU204Z9NZhOjV+zhF4wktm5gOuiUoVN95oYTh9BFEEIsyGQdxHhxTH31hWUNNh2Aj5dCrr/u6Q==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/auth"},"_npmVersion":"11.11.0","description":"Browser login, OAuth, and OIDC helpers for Remix","directories":{},"_nodeVersion":"24.14.1","dependencies":{"@remix-run/session":"^0.4.1","@remix-run/fetch-router":"^0.18.2"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/test":"0.3.0","@remix-run/assert":"0.2.0","@remix-run/cookie":"0.5.1","@remix-run/headers":"0.19.0","@remix-run/session":"0.4.1","@remix-run/fetch-router":"0.18.2","@remix-run/auth-middleware":"0.1.2","@typescript/native-preview":"7.0.0-dev.20251125.1","@remix-run/session-middleware":"0.2.2","@remix-run/form-data-middleware":"0.2.3"},"_npmOperationalInternal":{"tmp":"tmp/auth_0.2.1_1777576319471_0.014251720146780222","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@remix-run/auth","version":"0.2.2","keywords":["auth","authentication","oauth","oidc","atproto","bluesky","google","github","facebook","x","microsoft","okta","auth0","login","credentials","session"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/auth@0.2.2","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/auth#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"bb8865864f01c307f7a10f9232e42c8a17c550e9","tarball":"https://registry.npmjs.org/@remix-run/auth/-/auth-0.2.2.tgz","fileCount":79,"integrity":"sha512-zzNd187qshqFcWYEro0UDSAyXPhdOaVdQnS09xUpEcIfY3IxbDtziBNxCNtwCt0Ylevyi/3hwrPoz2pGOG4RUA==","signatures":[{"sig":"MEQCIBVFrGGOoEheLm0Ks+Fb/e0lHYQntmWbmeZK2NrbK0lbAiB5USEdmgXMh8sX3KYyp/DSXUdHUylS5B36cO3QSXT3+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fauth@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":263629},"type":"module","_from":"file:remix-run-auth-0.2.2.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"remix-test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix-test","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8e44cdde-a882-4bf8-bab3-12b1a877a11b"}},"_resolved":"/tmp/3b4e01e41f8329499702e03143ce49ae/remix-run-auth-0.2.2.tgz","_integrity":"sha512-zzNd187qshqFcWYEro0UDSAyXPhdOaVdQnS09xUpEcIfY3IxbDtziBNxCNtwCt0Ylevyi/3hwrPoz2pGOG4RUA==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/auth"},"_npmVersion":"11.12.1","description":"Browser login, OAuth, and OIDC helpers for Remix","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@remix-run/session":"^0.4.1","@remix-run/fetch-router":"^0.19.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/test":"0.4.0","@remix-run/assert":"0.2.0","@remix-run/cookie":"0.5.2","@remix-run/headers":"0.20.0","@remix-run/session":"0.4.1","@remix-run/fetch-router":"0.19.0","@remix-run/auth-middleware":"0.2.0","@typescript/native-preview":"7.0.0-dev.20251125.1","@remix-run/session-middleware":"0.3.0","@remix-run/form-data-middleware":"0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/auth_0.2.2_1779247351181_0.03035933760870524","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@remix-run/auth","version":"0.2.3","keywords":["auth","authentication","oauth","oidc","atproto","bluesky","google","github","facebook","x","microsoft","okta","auth0","login","credentials","session"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/auth@0.2.3","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/auth#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"5ac5c533c355898d543740ef78af53dc73c22cd9","tarball":"https://registry.npmjs.org/@remix-run/auth/-/auth-0.2.3.tgz","fileCount":79,"integrity":"sha512-AvnEo7Md5rYrDxItPnBLELJx8YRw1jmgpNJrWB7nK4xzIm5M8MSPRnPgkguxAUqe20+n2RKvxiE48IsEq5yLbg==","signatures":[{"sig":"MEQCIE34LKWBnKhfIG77y8LIXgW9stT209wWSK55Eom6VZC6AiAjRZyFW4h5e0zluhIyjodbE7D9XBUxwJkwEnbmmFKImA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fauth@0.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":263629},"type":"module","_from":"file:remix-run-auth-0.2.3.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"remix-test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix-test","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8e44cdde-a882-4bf8-bab3-12b1a877a11b"}},"_resolved":"/tmp/fb07db8890b876faa31f9295885a57c1/remix-run-auth-0.2.3.tgz","_integrity":"sha512-AvnEo7Md5rYrDxItPnBLELJx8YRw1jmgpNJrWB7nK4xzIm5M8MSPRnPgkguxAUqe20+n2RKvxiE48IsEq5yLbg==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/auth"},"_npmVersion":"11.12.1","description":"Browser login, OAuth, and OIDC helpers for Remix","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@remix-run/session":"^0.4.2","@remix-run/fetch-router":"^0.19.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/test":"0.4.1","@remix-run/assert":"0.2.1","@remix-run/cookie":"0.5.3","@remix-run/headers":"0.21.0","@remix-run/session":"0.4.2","@remix-run/fetch-router":"0.19.1","@remix-run/auth-middleware":"0.2.1","@typescript/native-preview":"7.0.0-dev.20251125.1","@remix-run/session-middleware":"0.3.1","@remix-run/form-data-middleware":"0.3.1"},"_npmOperationalInternal":{"tmp":"tmp/auth_0.2.3_1779308332491_0.1411137812575911","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@remix-run/auth","version":"0.2.4","keywords":["auth","authentication","oauth","oidc","atproto","bluesky","google","github","facebook","x","microsoft","okta","auth0","login","credentials","session"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/auth@0.2.4","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/auth#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"82eb5dd4e5717e59bbf48430489545f31a3be76c","tarball":"https://registry.npmjs.org/@remix-run/auth/-/auth-0.2.4.tgz","fileCount":79,"integrity":"sha512-fgDC+lJlOfrc50X9NtM8mMaoNWrRIuuX+kd/zNN07+aZYsJnZu+fsn0N49HcAOSY2u34IIv5RZHhXE7Mhci7kA==","signatures":[{"sig":"MEYCIQCNu+y1aDVRHalqbdkEln6BeTPSH/uqFhoLaJTecQp0oAIhANs+/lp5CvJnUlNBQKc0Ju9DcznImmo9NdXH1XTxbozo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fauth@0.2.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":264078},"type":"module","_from":"file:remix-run-auth-0.2.4.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"remix-test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix-test","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8e44cdde-a882-4bf8-bab3-12b1a877a11b"}},"_resolved":"/tmp/8c3ce76399c4be9ca9679c01c8eb99a6/remix-run-auth-0.2.4.tgz","_integrity":"sha512-fgDC+lJlOfrc50X9NtM8mMaoNWrRIuuX+kd/zNN07+aZYsJnZu+fsn0N49HcAOSY2u34IIv5RZHhXE7Mhci7kA==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/auth"},"_npmVersion":"11.13.0","description":"Browser login, OAuth, and OIDC helpers for Remix","directories":{},"_nodeVersion":"24.16.0","dependencies":{"@remix-run/session":"^0.4.2","@remix-run/fetch-router":"^0.19.2"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/test":"0.4.2","@remix-run/assert":"0.2.1","@remix-run/cookie":"0.5.4","@remix-run/headers":"0.21.1","@remix-run/session":"0.4.2","@remix-run/fetch-router":"0.19.2","@remix-run/auth-middleware":"0.2.2","@typescript/native-preview":"7.0.0-dev.20251125.1","@remix-run/session-middleware":"0.3.2","@remix-run/form-data-middleware":"0.3.2"},"_npmOperationalInternal":{"tmp":"tmp/auth_0.2.4_1780078679262_0.5957018887666174","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@remix-run/auth","version":"0.2.5","keywords":["auth","authentication","oauth","oidc","atproto","bluesky","google","github","facebook","x","microsoft","okta","auth0","login","credentials","session"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/auth@0.2.5","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/auth#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"60efe7a5edf894297bb9e795882473a43828d86e","tarball":"https://registry.npmjs.org/@remix-run/auth/-/auth-0.2.5.tgz","fileCount":79,"integrity":"sha512-liwLro3rHgtjTc3MuYD4iKlZUcVvAzZUSGk0Tc1JFd7QSI8E8G2QeCxJvZRpul6TO0ojnjSogNydmj42ZpI4iQ==","signatures":[{"sig":"MEUCIQDvuSUJHasb/W6qNmRrU2cfPmgIYNxHbfbuAxMqKVYXPgIgBrRy302Or2lToo0Cy8foH9Emb2+Hz9+qpVS7aP0lY48=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fauth@0.2.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":264078},"type":"module","_from":"file:remix-run-auth-0.2.5.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"remix-test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix-test","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8e44cdde-a882-4bf8-bab3-12b1a877a11b"}},"_resolved":"/tmp/8383fb91ef1a52ee5b12b4ed1df52e57/remix-run-auth-0.2.5.tgz","_integrity":"sha512-liwLro3rHgtjTc3MuYD4iKlZUcVvAzZUSGk0Tc1JFd7QSI8E8G2QeCxJvZRpul6TO0ojnjSogNydmj42ZpI4iQ==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/auth"},"_npmVersion":"11.13.0","description":"Browser login, OAuth, and OIDC helpers for Remix","directories":{},"_nodeVersion":"24.16.0","dependencies":{"@remix-run/session":"^0.4.2","@remix-run/fetch-router":"^0.20.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/test":"0.5.0","@remix-run/assert":"0.3.0","@remix-run/cookie":"0.5.4","@remix-run/headers":"0.21.1","@remix-run/session":"0.4.2","@remix-run/fetch-router":"0.20.0","@remix-run/auth-middleware":"0.2.3","@typescript/native-preview":"7.0.0-dev.20251125.1","@remix-run/session-middleware":"0.3.3","@remix-run/form-data-middleware":"0.3.3"},"_npmOperationalInternal":{"tmp":"tmp/auth_0.2.5_1780683974644_0.537763882721817","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"@remix-run/auth","version":"0.2.6","keywords":["auth","authentication","oauth","oidc","atproto","bluesky","google","github","facebook","x","microsoft","okta","auth0","login","credentials","session"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/auth@0.2.6","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/auth#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"be86e2ec2838fe74a4d9dc7ffc532e64afa32a03","tarball":"https://registry.npmjs.org/@remix-run/auth/-/auth-0.2.6.tgz","fileCount":79,"integrity":"sha512-7oRSZftQPvYN5vSk89vSZlJHR8iWyLLYTO1Hh6DZ4PI7nCO4V3i4WuHBzog3QajLJCCVhQnEt/o2SuPTBOTXGQ==","signatures":[{"sig":"MEUCIFkqmHPerGDYAT7gebHobQM9UhurmpyQn9uF//p5gWYeAiEAmJepZtVMaGzjWEy5AnrRUc07uGxshXpBFMEH6YxYh8c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fauth@0.2.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":268669},"type":"module","_from":"file:remix-run-auth-0.2.6.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"remix-test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix-test","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8e44cdde-a882-4bf8-bab3-12b1a877a11b"}},"_resolved":"/tmp/3b0a63fe15e1d0ae50f45a7472789584/remix-run-auth-0.2.6.tgz","_integrity":"sha512-7oRSZftQPvYN5vSk89vSZlJHR8iWyLLYTO1Hh6DZ4PI7nCO4V3i4WuHBzog3QajLJCCVhQnEt/o2SuPTBOTXGQ==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/auth"},"_npmVersion":"11.13.0","description":"Browser login, OAuth, and OIDC helpers for Remix","directories":{},"_nodeVersion":"24.17.0","dependencies":{"@remix-run/session":"^0.4.2","@remix-run/fetch-router":"^0.20.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/test":"0.5.0","@remix-run/assert":"0.3.0","@remix-run/cookie":"0.5.4","@remix-run/headers":"0.21.1","@remix-run/session":"0.4.2","@remix-run/fetch-router":"0.20.1","@remix-run/auth-middleware":"0.2.4","@typescript/native-preview":"7.0.0-dev.20251125.1","@remix-run/session-middleware":"0.3.4","@remix-run/form-data-middleware":"0.3.4"},"_npmOperationalInternal":{"tmp":"tmp/auth_0.2.6_1782932609345_0.9319124206148619","host":"s3://npm-registry-packages-npm-production"}},"0.2.7":{"name":"@remix-run/auth","version":"0.2.7","keywords":["auth","authentication","oauth","oidc","atproto","bluesky","google","github","facebook","x","microsoft","okta","auth0","login","credentials","session"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/auth@0.2.7","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/auth#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"32d371b669f826f016e32119127597802dc531d4","tarball":"https://registry.npmjs.org/@remix-run/auth/-/auth-0.2.7.tgz","fileCount":79,"integrity":"sha512-OWjt1KP8H5/kPRwDghOsilIKESBb2hg5DJQkmprXYx3xB0WZEphRHPp4ASqC6LXEu+mOfgxsHky7G8jJxWZSgw==","signatures":[{"sig":"MEUCIQC2+oyk1jc/Yv0rJZtdUPYXB0k1edCDlMM1npIFx1dtzQIgCUaoV1VSORHog+8hoAP6jNO9L4YywKKh11pafu5qwgM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fauth@0.2.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":268657},"type":"module","_from":"file:remix-run-auth-0.2.7.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"remix test","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8e44cdde-a882-4bf8-bab3-12b1a877a11b"}},"_resolved":"/tmp/58d221ec8950e3093b45e58246245c81/remix-run-auth-0.2.7.tgz","_integrity":"sha512-OWjt1KP8H5/kPRwDghOsilIKESBb2hg5DJQkmprXYx3xB0WZEphRHPp4ASqC6LXEu+mOfgxsHky7G8jJxWZSgw==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/auth"},"_npmVersion":"11.16.0","description":"Browser login, OAuth, and OIDC helpers for Remix","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@remix-run/session":"^0.4.2","@remix-run/fetch-router":"^0.21.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^24.6.0","@remix-run/test":"0.6.0","@remix-run/assert":"0.3.0","@remix-run/cookie":"0.6.0","@remix-run/headers":"0.21.1","@remix-run/session":"0.4.2","@remix-run/fetch-router":"0.21.0","@remix-run/auth-middleware":"0.2.5","@remix-run/session-middleware":"0.4.0","@remix-run/form-data-middleware":"0.3.5"},"_npmOperationalInternal":{"tmp":"tmp/auth_0.2.7_1786666472153_0.07128112899668126","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@remix-run/auth","version":"0.3.0","keywords":["auth","authentication","oauth","oidc","google","github","facebook","x","microsoft","okta","auth0","login","credentials","session"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/auth@0.3.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/auth#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"01437ebb4b5017999199f7cc2948005d32639e1d","tarball":"https://registry.npmjs.org/@remix-run/auth/-/auth-0.3.0.tgz","fileCount":75,"integrity":"sha512-ZcQng5NtF7jyKx5hdR1necSXRbVG14OOQIJ4ghM/Zyfs5CgQ7kNA9sNTaXKRaPkIo57jFP6Dd9AKA6Z46lrKxg==","signatures":[{"sig":"MEYCIQCcQGPknEedxn8l7tcXJ7JH4kDMK6VEBgkkbH6Q+rgdggIhAJ+Ud5CL7J6YnSOa+mA5FK7UaiwwSpw2vuRvWn0VDMM8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fauth@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":172289},"type":"module","_from":"file:/tmp/remix-publish-auth-uZJVPj/remix-run-auth-0.3.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"remix test","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8e44cdde-a882-4bf8-bab3-12b1a877a11b"}},"_resolved":"/tmp/remix-publish-auth-uZJVPj/remix-run-auth-0.3.0.tgz","_integrity":"sha512-ZcQng5NtF7jyKx5hdR1necSXRbVG14OOQIJ4ghM/Zyfs5CgQ7kNA9sNTaXKRaPkIo57jFP6Dd9AKA6Z46lrKxg==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/auth"},"_npmVersion":"11.17.0","description":"Browser login, OAuth, and OIDC helpers for Remix","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@remix-run/session":"^0.4.2","@remix-run/fetch-router":"^0.21.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^24.6.0","@remix-run/test":"0.6.0","@remix-run/assert":"0.3.0","@remix-run/cookie":"0.6.0","@remix-run/headers":"0.21.1","@remix-run/session":"0.4.2","@remix-run/fetch-router":"0.21.0","@remix-run/auth-middleware":"0.2.5","@remix-run/session-middleware":"0.4.0","@remix-run/form-data-middleware":"0.3.5"},"_npmOperationalInternal":{"tmp":"tmp/auth_0.3.0_1788202616864_0.7716662794485569","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@remix-run/auth","version":"0.3.1","keywords":["auth","authentication","oauth","oidc","google","github","facebook","x","microsoft","okta","auth0","login","credentials","session"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/auth@0.3.1","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/auth#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"8461fa60b6ac0018c3ca7c1585ab8d52e4014342","tarball":"https://registry.npmjs.org/@remix-run/auth/-/auth-0.3.1.tgz","fileCount":75,"integrity":"sha512-iYSGBxp1l1x9xLV/KX965ai89OYAA216oEG8VIf3I1y0cg+miVzr1mCpx5UIfGJoYY+7GVnPRsRMNI61X4VtQQ==","signatures":[{"sig":"MEYCIQCkT8gXWzB2lqmcA8MFgX3Xyn+N4MlCgFPcRQ3riqXitAIhAMrUdrLBqiAWDWwCZ50+xSXytab76suawzPRFEQmYi1O","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fauth@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":172289},"type":"module","_from":"file:/tmp/remix-publish-auth-gRrpUd/remix-run-auth-0.3.1.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"remix test","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8e44cdde-a882-4bf8-bab3-12b1a877a11b"}},"_resolved":"/tmp/remix-publish-auth-gRrpUd/remix-run-auth-0.3.1.tgz","_integrity":"sha512-iYSGBxp1l1x9xLV/KX965ai89OYAA216oEG8VIf3I1y0cg+miVzr1mCpx5UIfGJoYY+7GVnPRsRMNI61X4VtQQ==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/auth"},"_npmVersion":"11.19.0","description":"Browser login, OAuth, and OIDC helpers for Remix","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@remix-run/session":"^0.4.2","@remix-run/fetch-router":"^0.22.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^24.6.0","@remix-run/test":"0.6.0","@remix-run/assert":"0.3.0","@remix-run/cookie":"0.6.0","@remix-run/headers":"0.21.1","@remix-run/session":"0.4.2","@remix-run/fetch-router":"0.22.0","@remix-run/auth-middleware":"0.2.6","@remix-run/session-middleware":"0.4.1","@remix-run/form-data-middleware":"0.3.6"},"_npmOperationalInternal":{"tmp":"tmp/auth_0.3.1_1788908556707_0.8918333859111556","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"_id":"@remix-run/auth@0.3.2","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"3289e22ec504895b89d33691d1612cb620f5692e","tarball":"https://registry.npmjs.org/@remix-run/auth/-/auth-0.3.2.tgz","fileCount":75,"integrity":"sha512-ffbtpB7V5oBIRaeeX8J1VhFxIhKsJTt66ilO03aaf8kk0xNwsRrisCTxOX/bRbGCjSQhwUZKlm6Idh8/sCYUTw==","signatures":[{"sig":"MEUCIDktCiIi29k21i2wlXL/Dg7pSXOltwQhtOWBPkNeJaX7AiEA1SD6i/dHEfkeme13wOs01woLjhXE5mdFl0aIl6vvJ+M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDzzYe56JKlXsHq0aP7iS2ZLnXxs4TtVbUiTyh+zbN7vQIga9CUq0Krdz2yUu+VaeRIykcK0xHy59BGyr1glJRI3EA="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fauth@0.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":172756},"name":"@remix-run/auth","type":"module","_from":"file:/tmp/remix-publish-auth-6KCgaH/remix-run-auth-0.3.2.tgz","author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"license":"MIT","scripts":{"test":"remix test","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix test","typecheck":"tsc --noEmit"},"version":"0.3.2","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8e44cdde-a882-4bf8-bab3-12b1a877a11b"}},"homepage":"https://github.com/remix-run/remix/tree/main/packages/auth#readme","keywords":["auth","authentication","oauth","oidc","google","github","facebook","x","microsoft","okta","auth0","login","credentials","session"],"_resolved":"/tmp/remix-publish-auth-6KCgaH/remix-run-auth-0.3.2.tgz","_integrity":"sha512-ffbtpB7V5oBIRaeeX8J1VhFxIhKsJTt66ilO03aaf8kk0xNwsRrisCTxOX/bRbGCjSQhwUZKlm6Idh8/sCYUTw==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/auth"},"_npmVersion":"11.19.0","description":"Browser login, OAuth, and OIDC helpers for Remix","directories":{},"maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"_nodeVersion":"24.20.0","dependencies":{"@remix-run/session":"^0.4.2","@remix-run/fetch-router":"^0.22.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^24.6.0","@remix-run/test":"0.6.1","@remix-run/assert":"0.3.0","@remix-run/cookie":"0.7.0","@remix-run/headers":"0.21.2","@remix-run/session":"0.4.2","@remix-run/fetch-router":"0.22.1","@remix-run/auth-middleware":"0.2.7","@remix-run/session-middleware":"0.5.0","@remix-run/form-data-middleware":"0.3.7"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/auth_0.3.2_1789770866047_0.18672708128149362"}}},"time":{"created":"2026-03-19T01:29:41.989Z","modified":"2026-09-18T22:34:26.473Z","0.0.0":"2026-03-19T01:29:42.216Z","0.1.0":"2026-03-25T23:04:30.409Z","0.1.1":"2026-04-23T00:38:08.874Z","0.2.0":"2026-04-29T17:30:30.853Z","0.2.1":"2026-04-30T19:11:59.618Z","0.2.2":"2026-05-20T03:22:31.316Z","0.2.3":"2026-05-20T20:18:52.628Z","0.2.4":"2026-05-29T18:17:59.427Z","0.2.5":"2026-06-05T18:26:14.799Z","0.2.6":"2026-07-01T19:03:29.498Z","0.2.7":"2026-08-14T00:14:32.308Z","0.3.0":"2026-08-31T18:56:56.999Z","0.3.1":"2026-09-08T23:02:36.884Z","0.3.2":"2026-09-18T22:34:26.140Z"},"bugs":{"url":"https://github.com/remix-run/remix/issues"},"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","homepage":"https://github.com/remix-run/remix/tree/main/packages/auth#readme","keywords":["auth","authentication","oauth","oidc","google","github","facebook","x","microsoft","okta","auth0","login","credentials","session"],"repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/auth"},"description":"Browser login, OAuth, and OIDC helpers for Remix","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"readme":"# auth\n\nComposable browser authentication primitives for Remix. Use this package to verify credentials on your own server, start external OAuth or OIDC redirects, finish provider callbacks, and write an app-owned auth record into the session. Pair it with [`remix/middleware/auth`](https://github.com/remix-run/remix/tree/main/packages/auth-middleware) when later requests need to resolve that session data into the current user and protect routes.\n\n## Features\n\n- Small, composable primitives: `verifyCredentials()`, `startExternalAuth()`, `finishExternalAuth()`, `refreshExternalAuth()`, and `completeAuth()`\n- Built-in provider support for Google, Microsoft, Okta, Auth0, GitHub, Facebook, and X\n- Module-scope provider configuration for boot-time validation and stable callback URLs\n- App-owned session records so you decide what auth data to persist\n- Shared session completion for credentials and external auth flows\n- Designed to pair with `remix/middleware/auth` for request-time auth resolution and route protection\n\n## Installation\n\n```sh\nnpm i remix\n```\n\n## Usage\n\n`remix/auth` exposes five primitives:\n\n- `verifyCredentials(provider, context)` parses submitted credentials and returns the authenticated result or `null`\n- `startExternalAuth(provider, context, options?)` stores the in-progress OAuth transaction in the session and returns the provider redirect response\n- `finishExternalAuth(provider, context, options?)` validates the callback, clears the stored transaction, and returns `{ result, returnTo? }`, including any provider tokens in `result.tokens`\n- `refreshExternalAuth(provider, tokens)` exchanges a previously stored `refreshToken` for a fresh provider token bundle when the provider runtime supports refresh\n- `completeAuth(context)` rotates the current session id and returns the session for auth writes\n\nThe route owns redirects, flashes, and other app-specific behavior. `remix/auth` owns the protocol work.\n\n## Credentials Auth\n\nUse `createCredentialsAuthProvider()` when your own server can verify submitted credentials directly, such as email/password logins.\n\n```ts\nimport { auth, Auth, createSessionAuthScheme, requireAuth } from 'remix/middleware/auth'\nimport { completeAuth, createCredentialsAuthProvider, verifyCredentials } from 'remix/auth'\nimport { createCookie } from 'remix/cookie'\nimport { createRouter } from 'remix/router'\nimport { formData } from 'remix/middleware/form-data'\nimport { form, route } from 'remix/routes'\nimport type { GoodAuth } from 'remix/middleware/auth'\nimport { redirect } from 'remix/response/redirect'\nimport { Session } from 'remix/session'\nimport { session } from 'remix/middleware/session'\nimport { createCookieSessionStorage } from 'remix/session-storage/cookie'\n\nlet sessionCookie = createCookie('__session', {\n  secrets: [env.SESSION_SECRET],\n  httpOnly: true,\n  secure: true,\n  sameSite: 'lax',\n  path: '/',\n})\n\nlet sessionStorage = createCookieSessionStorage()\n\nlet routes = route({\n  auth: {\n    session: {\n      login: form('/login'),\n      logout: { method: 'POST', pattern: '/logout' },\n    },\n  },\n  app: {\n    dashboard: '/dashboard',\n  },\n})\n\nlet passwordProvider = createCredentialsAuthProvider({\n  parse(context) {\n    let formData = context.get(FormData)\n    if (formData == null) {\n      throw new Error('Expected formData() middleware before verifyCredentials()')\n    }\n\n    return {\n      email: String(formData.get('email') ?? ''),\n      password: String(formData.get('password') ?? ''),\n    }\n  },\n  async verify({ email, password }) {\n    return users.verifyPassword(email, password)\n  },\n})\n\nlet router = createRouter({\n  middleware: [\n    session(sessionCookie, sessionStorage),\n    formData(),\n    auth({\n      schemes: [\n        createSessionAuthScheme({\n          read(session) {\n            return session.get('auth') as { userId: string } | null\n          },\n          verify(value) {\n            return users.getById(value.userId)\n          },\n          invalidate(session) {\n            session.unset('auth')\n          },\n        }),\n      ],\n    }),\n  ],\n})\n\nrouter.get(routes.auth.session.login.index, () => new Response('Login page'))\n\nrouter.post(routes.auth.session.login.action, async (context) => {\n  let user = await verifyCredentials(passwordProvider, context)\n\n  if (user == null) {\n    return redirect(routes.auth.session.login.index.href())\n  }\n\n  let session = completeAuth(context)\n  session.set('auth', { userId: user.id })\n\n  return redirect(routes.app.dashboard.href())\n})\n\nrouter.post(routes.auth.session.logout, ({ get }) => {\n  let session = get(Session)\n  session.unset('auth')\n  session.regenerateId(true)\n  return redirect(routes.auth.session.login.index.href())\n})\n\nrouter.get(routes.app.dashboard, {\n  middleware: [requireAuth()],\n  handler(context) {\n    let auth = context.get(Auth) as GoodAuth<{ id: string; email: string }>\n\n    return Response.json({\n      id: auth.identity.id,\n      email: auth.identity.email,\n      method: auth.method,\n    })\n  },\n})\n```\n\n## External Auth\n\nStarting from the same `session()`, `auth()`, and `createSessionAuthScheme()` setup as the credentials example above, you can add a Google login flow like this. The provider is created once at module scope, and the routes compose `startExternalAuth()`, `finishExternalAuth()`, and `completeAuth()` directly.\n\n`returnTo` accepts local paths beginning with `/`, including queries and fragments. The auth helpers normalize the path and omit targets that resolve to another origin or normalize to an authority reference beginning with `//`. `finishExternalAuth()` also validates targets from existing transactions.\n\n```ts\nimport { auth, Auth, createSessionAuthScheme, requireAuth } from 'remix/middleware/auth'\nimport {\n  completeAuth,\n  createGoogleAuthProvider,\n  finishExternalAuth,\n  refreshExternalAuth,\n  startExternalAuth,\n} from 'remix/auth'\nimport { createCookie } from 'remix/cookie'\nimport { createRouter } from 'remix/router'\nimport { route } from 'remix/routes'\nimport type { GoodAuth } from 'remix/middleware/auth'\nimport { redirect } from 'remix/response/redirect'\nimport { session } from 'remix/middleware/session'\nimport { createCookieSessionStorage } from 'remix/session-storage/cookie'\n\nlet sessionCookie = createCookie('__session', {\n  secrets: [env.SESSION_SECRET],\n  httpOnly: true,\n  secure: true,\n  sameSite: 'lax',\n  path: '/',\n})\n\nlet sessionStorage = createCookieSessionStorage()\n\nlet routes = route({\n  auth: {\n    session: {\n      login: '/login',\n    },\n    google: {\n      login: '/login/google',\n      callback: '/auth/google/callback',\n    },\n  },\n  app: {\n    dashboard: '/dashboard',\n  },\n})\n\nlet googleProvider = createGoogleAuthProvider({\n  clientId: env.GOOGLE_CLIENT_ID,\n  clientSecret: env.GOOGLE_CLIENT_SECRET,\n  redirectUri: new URL(routes.auth.google.callback.href(), env.APP_ORIGIN),\n  authorizationParams: {\n    access_type: 'offline',\n    prompt: 'consent',\n  },\n})\n\nlet router = createRouter({\n  middleware: [\n    session(sessionCookie, sessionStorage),\n    auth({\n      schemes: [\n        createSessionAuthScheme({\n          read(session) {\n            return session.get('auth') as { userId: string } | null\n          },\n          verify(value) {\n            return users.getById(value.userId)\n          },\n          invalidate(session) {\n            session.unset('auth')\n          },\n        }),\n      ],\n    }),\n  ],\n})\n\nrouter.get(routes.auth.session.login, () => {\n  return new Response(`<a href=\"${routes.auth.google.login.href()}\">Login with Google</a>`, {\n    headers: {\n      'Content-Type': 'text/html; charset=utf-8',\n    },\n  })\n})\n\nrouter.get(routes.auth.google.login, (context) =>\n  startExternalAuth(googleProvider, context, {\n    returnTo: context.url.searchParams.get('returnTo'),\n  }),\n)\n\nrouter.get(routes.auth.google.callback, async (context) => {\n  let { result, returnTo } = await finishExternalAuth(googleProvider, context)\n\n  let user = await users.upsertFromGoogle(result.profile)\n  await persistProviderTokens(user.id, result.tokens)\n\n  let session = completeAuth(context)\n  session.set('auth', { userId: user.id })\n\n  return redirect(returnTo ?? routes.app.dashboard.href())\n})\n\nasync function getGoogleAccessToken(userId: string) {\n  let tokens = await readStoredProviderTokens(userId)\n  if (tokens == null) {\n    return null\n  }\n\n  if (tokens.expiresAt != null && tokens.expiresAt.getTime() <= Date.now()) {\n    tokens = (await refreshExternalAuth(googleProvider, tokens)).tokens\n    await persistProviderTokens(userId, tokens)\n  }\n\n  return tokens.accessToken\n}\n\nrouter.get(routes.app.dashboard, {\n  middleware: [requireAuth()],\n  handler(context) {\n    let auth = context.get(Auth) as GoodAuth<{ id: string; email: string | null }>\n\n    return Response.json({\n      id: auth.identity.id,\n      email: auth.identity.email,\n      method: auth.method,\n    })\n  },\n})\n```\n\nA typical external auth flow looks like this:\n\n1. Create the provider once at module scope.\n2. Call `startExternalAuth()` from the login route.\n3. Call `finishExternalAuth()` from the callback route.\n4. Persist any provider tokens you want to reuse later.\n5. Call `completeAuth(context)` and write your auth record into the returned session.\n6. On a later follow-up request, load the stored provider tokens, refresh them with `refreshExternalAuth()` only if needed, then save the refreshed bundle back to storage.\n7. Return your own redirect or other response.\n\n## Built-in External Auth Providers\n\nWhen one of the built-in providers matches your auth provider, start there. Google, Microsoft, Okta, and Auth0 use the shared OIDC runtime. GitHub, Facebook, and X use built-in custom OAuth flows.\n\n```ts\nimport {\n  createAuth0AuthProvider,\n  createFacebookAuthProvider,\n  createGitHubAuthProvider,\n  createGoogleAuthProvider,\n  createMicrosoftAuthProvider,\n  createOktaAuthProvider,\n  createXAuthProvider,\n} from 'remix/auth'\n\nlet auth0Provider = createAuth0AuthProvider({\n  domain: env.AUTH0_DOMAIN,\n  clientId: env.AUTH0_CLIENT_ID,\n  clientSecret: env.AUTH0_CLIENT_SECRET,\n  redirectUri: new URL('/auth/auth0/callback', env.APP_ORIGIN),\n})\n\nlet facebookProvider = createFacebookAuthProvider({\n  clientId: env.FACEBOOK_CLIENT_ID,\n  clientSecret: env.FACEBOOK_CLIENT_SECRET,\n  redirectUri: new URL('/auth/facebook/callback', env.APP_ORIGIN),\n})\n\nlet githubProvider = createGitHubAuthProvider({\n  clientId: env.GITHUB_CLIENT_ID,\n  clientSecret: env.GITHUB_CLIENT_SECRET,\n  redirectUri: new URL('/auth/github/callback', env.APP_ORIGIN),\n})\n\nlet googleProvider = createGoogleAuthProvider({\n  clientId: env.GOOGLE_CLIENT_ID,\n  clientSecret: env.GOOGLE_CLIENT_SECRET,\n  redirectUri: new URL('/auth/google/callback', env.APP_ORIGIN),\n})\n\nlet microsoftProvider = createMicrosoftAuthProvider({\n  tenant: 'organizations',\n  clientId: env.MICROSOFT_CLIENT_ID,\n  clientSecret: env.MICROSOFT_CLIENT_SECRET,\n  redirectUri: new URL('/auth/microsoft/callback', env.APP_ORIGIN),\n})\n\nlet oktaProvider = createOktaAuthProvider({\n  issuer: env.OKTA_ISSUER,\n  clientId: env.OKTA_CLIENT_ID,\n  clientSecret: env.OKTA_CLIENT_SECRET,\n  redirectUri: new URL('/auth/okta/callback', env.APP_ORIGIN),\n})\n\nlet xProvider = createXAuthProvider({\n  clientId: env.X_CLIENT_ID,\n  clientSecret: env.X_CLIENT_SECRET,\n  redirectUri: new URL('/auth/x/callback', env.APP_ORIGIN),\n})\n```\n\nNotes:\n\n- OIDC providers use discovery by default at `/.well-known/openid-configuration`\n- Pass `metadata` when you want to skip discovery or `discoveryUrl` when the metadata document lives elsewhere\n- Default OIDC scopes are `openid profile email`\n- `createGoogleAuthProvider()` uses the same OIDC runtime with Google's published endpoints wired in directly, so it does not need a discovery request\n- `createMicrosoftAuthProvider()` adds the `tenant` option and builds the issuer from it\n- `createOktaAuthProvider()` expects the full Okta issuer URL, usually something like `https://example.okta.com/oauth2/default`\n- `createAuth0AuthProvider()` expects your Auth0 domain and derives the issuer URL for you\n- `refreshExternalAuth()` supports built-in OIDC providers and X when the stored token bundle includes a refresh token\n- Providers only return refresh tokens when configured to request offline access, such as `authorizationParams: { access_type: 'offline' }` for Google or adding `offline.access` to X scopes\n- Use `mapProfile()` with `createOIDCAuthProvider()` when you want `result.profile` to have an app-specific type before it reaches your route code\n\nDefault scopes for OAuth providers that don't use OIDC discovery:\n\n- GitHub: `read:user user:email`\n- Facebook: `public_profile email`\n- X: `tweet.read users.read`\n\nPass `scopes` if you need a different set for a provider.\n\n## Custom Auth Providers\n\nUse `createOIDCAuthProvider()` directly for custom external auth providers. This is the extension point for providers that support OpenID Connect discovery, authorization code flow, and a userinfo endpoint. Reach for a custom OAuth provider implementation only when the provider does not support OIDC.\n\n```ts\nimport {\n  completeAuth,\n  createOIDCAuthProvider,\n  finishExternalAuth,\n  startExternalAuth,\n} from 'remix/auth'\nimport { redirect } from 'remix/response/redirect'\n\nlet companyProvider = createOIDCAuthProvider({\n  name: 'company',\n  issuer: 'https://sso.acme.com',\n  clientId: 'acme-web',\n  clientSecret: 'acme-web-secret',\n  redirectUri: new URL('/auth/company/callback', 'https://app.acme.com'),\n  authorizationParams: {\n    prompt: 'login',\n  },\n  mapProfile({ claims }) {\n    return {\n      id: claims.sub,\n      email: claims.email ?? null,\n      name: claims.name ?? claims.preferred_username ?? 'Unknown user',\n    }\n  },\n})\n\nrouter.get('/login/company', (context) =>\n  startExternalAuth(companyProvider, context, {\n    returnTo: context.url.searchParams.get('returnTo'),\n  }),\n)\n\nrouter.get('/auth/company/callback', async (context) => {\n  let { result, returnTo } = await finishExternalAuth(companyProvider, context)\n\n  let user = await users.upsertFromCompanySSO(result.profile)\n  let session = completeAuth(context)\n  session.set('auth', { userId: user.id })\n\n  return redirect(returnTo ?? '/dashboard')\n})\n```\n\nProvider packages for other OAuth protocols can use `createOAuthProvider()` to implement the authorization, callback, and optional refresh hooks consumed by `startExternalAuth()`, `finishExternalAuth()`, and `refreshExternalAuth()`.\n\n```ts\nimport { createOAuthProvider } from 'remix/auth'\nimport type { OAuthTokens } from 'remix/auth'\n\ninterface AcmeProfile {\n  id: string\n  email: string\n}\n\ninterface AcmeTokens extends OAuthTokens {\n  resourceServer: string\n}\n\nexport function createAcmeAuthProvider(options: AcmeAuthProviderOptions) {\n  return createOAuthProvider<AcmeProfile, 'acme', AcmeTokens>('acme', {\n    async createAuthorizationURL(transaction) {\n      let metadata = await discoverAuthorizationServer(options)\n\n      transaction.providerState = await encryptProviderState(metadata)\n      return createAuthorizationRequest(metadata, transaction)\n    },\n    async handleCallback(context, transaction) {\n      let metadata = await decryptProviderState(transaction.providerState)\n      let tokens = await exchangeAuthorizationCode(metadata, context, transaction)\n      let profile = await loadProfile(tokens)\n\n      return {\n        provider: 'acme',\n        account: {\n          provider: 'acme',\n          providerAccountId: profile.id,\n        },\n        profile,\n        tokens,\n      }\n    },\n    async refreshTokens(tokens) {\n      return refreshAcmeTokens(tokens)\n    },\n  })\n}\n```\n\nThe runtime may write a serialized value to `transaction.providerState` during `createAuthorizationURL()`. Remix persists that value with the OAuth transaction and returns it to `handleCallback()`. Treat it as provider-owned opaque data, and encrypt sensitive values because session storage is not guaranteed to be confidential. Extending `OAuthTokens` preserves provider-specific fields through callback and refresh results without requiring those fields to become part of Remix's built-in token model.\n\n## Related Packages\n\n- [`auth-middleware`](https://github.com/remix-run/remix/tree/main/packages/auth-middleware) - Request authentication and route protection helpers\n- [`form-data-middleware`](https://github.com/remix-run/remix/tree/main/packages/form-data-middleware) - Form body parsing for `createCredentialsAuthProvider()` routes\n- [`session-middleware`](https://github.com/remix-run/remix/tree/main/packages/session-middleware) - Request-scoped session loading and persistence\n- [`session`](https://github.com/remix-run/remix/tree/main/packages/session) - Session data model and storage backends\n- [`fetch-router`](https://github.com/remix-run/remix/tree/main/packages/fetch-router) - Router and middleware runtime\n\n## Related Work\n\n- [OAuth 2.0](https://oauth.net/2/)\n- [RFC 7636: PKCE](https://datatracker.ietf.org/doc/html/rfc7636)\n- [OpenID Connect Core](https://openid.net/specs/openid-connect-core-1_0.html)\n- [OpenID Connect Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html)\n\n## License\n\nSee [LICENSE](https://github.com/remix-run/remix/blob/main/LICENSE)\n","readmeFilename":"README.md"}