From 00c205995a60776cef0203111cc18b9f087ebf8d Mon Sep 17 00:00:00 2001 From: Justin Makaila <1638996+justinmakaila@users.noreply.github.com> Date: Mon, 1 Sep 2025 09:34:08 -0400 Subject: [PATCH 1/5] Add iracing provider and image --- docs/public/img/providers/iracing.svg | 1 + packages/core/src/providers/iracing.ts | 73 ++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 docs/public/img/providers/iracing.svg create mode 100644 packages/core/src/providers/iracing.ts diff --git a/docs/public/img/providers/iracing.svg b/docs/public/img/providers/iracing.svg new file mode 100644 index 0000000000..6525b85a45 --- /dev/null +++ b/docs/public/img/providers/iracing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/core/src/providers/iracing.ts b/packages/core/src/providers/iracing.ts new file mode 100644 index 0000000000..70d2af78f5 --- /dev/null +++ b/packages/core/src/providers/iracing.ts @@ -0,0 +1,73 @@ +/** + *
( + options: OAuthUserConfig
+): OAuthConfig
{ + return { + id: "iracing", + name: "iRacing", + type: "oauth", + issuer: "https://oauth.iracing.com/oauth2", + authorization: { + url: "https://oauth.iracing.com/oauth2/authorize", + params: { + scope: "iracing.profile", + }, + }, + token: "https://oauth.iracing.com/oauth2/token", + userinfo: "https://oauth.iracing.com/oauth2/iracing/profile", + profile(profile) { + return { + id: profile.iracing_cust_id.toString(), + name: profile.iracing_name, + } + }, + options, + } +} From a8f2dea970565eb784188dc092dc848a4bf3a14a Mon Sep 17 00:00:00 2001 From: Justin Makaila <1638996+justinmakaila@users.noreply.github.com> Date: Wed, 3 Sep 2025 16:16:25 -0400 Subject: [PATCH 2/5] Implement conform for token responses. --- packages/core/src/providers/iracing.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/core/src/providers/iracing.ts b/packages/core/src/providers/iracing.ts index 70d2af78f5..4258702ee9 100644 --- a/packages/core/src/providers/iracing.ts +++ b/packages/core/src/providers/iracing.ts @@ -60,7 +60,20 @@ export default function IRacing
( scope: "iracing.profile", }, }, - token: "https://oauth.iracing.com/oauth2/token", + token: { + url: "https://oauth.iracing.com/oauth2/token", + conform: async (response) => { + const data = await response.clone().json() + if (data?.refresh_token === null) { + delete data.refresh_token + } + + return new Response(JSON.stringify(data), { + status: response.status, + headers: response.headers, + }) + }, + }, userinfo: "https://oauth.iracing.com/oauth2/iracing/profile", profile(profile) { return { From ca63152cf5d8ee8912516e88e14b110464fae336 Mon Sep 17 00:00:00 2001 From: Justin Makaila <1638996+justinmakaila@users.noreply.github.com> Date: Wed, 3 Sep 2025 16:26:47 -0400 Subject: [PATCH 3/5] nullify other missing fields --- packages/core/src/providers/iracing.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/core/src/providers/iracing.ts b/packages/core/src/providers/iracing.ts index 4258702ee9..4d7eb0a514 100644 --- a/packages/core/src/providers/iracing.ts +++ b/packages/core/src/providers/iracing.ts @@ -68,6 +68,14 @@ export default function IRacing
( delete data.refresh_token } + if (data?.refresh_token_expires_in === null) { + delete data.refresh_token_expires_in + } + + if (data?.scope === null) { + delete data.scope + } + return new Response(JSON.stringify(data), { status: response.status, headers: response.headers, From f65736ea7e27972006e568a5f74647eaa5f77905 Mon Sep 17 00:00:00 2001 From: Justin Makaila <1638996+justinmakaila@users.noreply.github.com> Date: Wed, 3 Sep 2025 17:07:17 -0400 Subject: [PATCH 4/5] Update bug provider --- .github/ISSUE_TEMPLATE/2_bug_provider.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/2_bug_provider.yml b/.github/ISSUE_TEMPLATE/2_bug_provider.yml index 1ee4409a23..74b31be6f4 100644 --- a/.github/ISSUE_TEMPLATE/2_bug_provider.yml +++ b/.github/ISSUE_TEMPLATE/2_bug_provider.yml @@ -59,6 +59,7 @@ body: - "Hugging Face" - "Identity Server 4" - "Instagram" + - "iRacing" - "Kakao" - "Frontegg" - "Keycloak" From 15e2f8772755ac33b7071aab4f1fcd58dd7d2d91 Mon Sep 17 00:00:00 2001 From: Justin Makaila <1638996+justinmakaila@users.noreply.github.com> Date: Wed, 3 Sep 2025 17:46:45 -0400 Subject: [PATCH 5/5] add brand colors --- packages/core/src/providers/iracing.ts | 27 +++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/core/src/providers/iracing.ts b/packages/core/src/providers/iracing.ts index 4d7eb0a514..380c1a1b61 100644 --- a/packages/core/src/providers/iracing.ts +++ b/packages/core/src/providers/iracing.ts @@ -44,7 +44,31 @@ export interface IRacingProfile { * * ### Resources * + * - [iRacing OAuth documentation](https://oauth.iracing.com/oauth2/book/introduction.html) + * * ### Notes + * + * By default, Auth.js assumes that the iRacing provider is + * based on the [OAuth 2](https://www.rfc-editor.org/rfc/rfc6749.html) specification. + * + * You need to configure a client with iRacing as described at https://oauth.iracing.com/oauth2/book/client_registration.html + * + * :::tip + * + * The HubSpot provider comes with a [default configuration](https://github.com/nextauthjs/next-auth/blob/main/packages/core/src/providers/hubspot.ts). + * To override the defaults for your use case, check out [customizing a built-in OAuth provider](https://authjs.dev/guides/configuring-oauth-providers). + * + * ::: + * + * :::info **Disclaimer** + * + * If you think you found a bug in the default configuration, you can [open an issue](https://authjs.dev/new/provider-issue). + * + * Auth.js strictly adheres to the specification and it cannot take responsibility for any deviation from + * the spec by the provider. You can open an issue, but if the problem is non-compliance with the spec, + * we might not pursue a resolution. You can ask for more help in [Discussions](https://authjs.dev/new/github-discussions). + * + * ::: */ export default function IRacing
( options: OAuthUserConfig
@@ -57,7 +81,7 @@ export default function IRacing
( authorization: { url: "https://oauth.iracing.com/oauth2/authorize", params: { - scope: "iracing.profile", + scope: "iracing.profile iracing.auth", }, }, token: { @@ -89,6 +113,7 @@ export default function IRacing
( name: profile.iracing_name, } }, + style: { brandColor: "#0F1F43", text: "#fff" }, options, } }