Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Auth provider for Linkedin not working #8831

Closed
andersengenolsen opened this issue Oct 10, 2023 · 62 comments · Fixed by #10671 or #10765
Closed

Auth provider for Linkedin not working #8831

andersengenolsen opened this issue Oct 10, 2023 · 62 comments · Fixed by #10671 or #10765
Labels
bug Something isn't working providers upstream The issue dervies from one of next-auth dependencies

Comments

@andersengenolsen
Copy link

andersengenolsen commented Oct 10, 2023

Environment

System:
OS: Linux 6.2 Ubuntu 22.04.3 LTS 22.04.3 LTS (Jammy Jellyfish)
CPU: (12) x64 AMD Ryzen 5 3600X 6-Core Processor
Memory: 2.63 GB / 15.53 GB
Container: Yes
Shell: 5.1.16 - /bin/bash
Binaries:
Node: 20.4.0 - /usr/local/bin/node
npm: 9.7.2 - /usr/local/bin/npm

Reproduction URL

https://github.com/nextauthjs/next-auth-example

Describe the issue

As per the documentation from Linkedin, I've set up a new LinkedIn app, and added "Sign In with LinkedIn using OpenID Connect" as a product.

At first I had some problems when not specifying scope.

providers: [ LinkedIn({ clientId: process.env.LINKEDIN_ID, clientSecret: process.env.LINKEDIN_SECRET, }) ], pages: { signIn: '/register-cv' },

This returns an 'unauthorized_scope_error' for r_emailaddress. Managed to fix that issue by providing scopes as per the documentation from Microsoft:

Authenticating Members
New members logging in to your service for the first time will need to follow the Authenticating with OAuth 2.0 Guide. When requesting the authorization code in Step 2 of the OAuth 2.0 Guide, make sure you use the OpenID scope openid to get the ID Token. We are also introducing new scopes profile and email.

openid Required to indicate the application wants to use OIDC to authenticate the member.
profile Required to retrieve the member's lite profile including their id, name, and profile picture.
email Required to retrieve the member's email address.
After successful authentication, you will receive the member's access token and ID token.

If your application does not have these permissions provisioned, you can request access through the Developer Portal. Select your app from My Apps, navigate to the Products tab, and request the Sign in with LinkedIn using OpenID Connect product.

Link: https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/sign-in-with-linkedin-v2

Updated scopes to match the documentation from Microsoft:

LinkedIn({ clientId: process.env.LINKEDIN_ID, clientSecret: process.env.LINKEDIN_SECRET, authorization: { params: { scope: 'openid profile email' } }})

Now getting this error:

https://next-auth.js.org/errors#oauth_callback_error unexpected iss value, expected undefined, got: https://www.linkedin.com { error: RPError: unexpected iss value, expected undefined, got: https://www.linkedin.com at Client.validateJWT (/home/deb/PhpstormProjects/cvmaker/node_modules/openid-client/lib/client.js:931:15) at Client.validateIdToken (/home/deb/PhpstormProjects/cvmaker/node_modules/openid-client/lib/client.js:766:60) at Client.callback (/home/deb/PhpstormProjects/cvmaker/node_modules/openid-client/lib/client.js:505:18) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async oAuthCallback (/home/deb/PhpstormProjects/cvmaker/node_modules/next-auth/core/lib/oauth/callback.js:109:16) at async Object.callback (/home/deb/PhpstormProjects/cvmaker/node_modules/next-auth/core/routes/callback.js:52:11) at async AuthHandler (/home/deb/PhpstormProjects/cvmaker/node_modules/next-auth/core/index.js:208:28) at async NextAuthApiHandler (/home/deb/PhpstormProjects/cvmaker/node_modules/next-auth/next/index.js:22:19) at async NextAuth._args$ (/home/deb/PhpstormProjects/cvmaker/node_modules/next-auth/next/index.js:108:14) { name: 'OAuthCallbackError', code: undefined }, providerId: 'linkedin', message: 'unexpected iss value, expected undefined, got: https://www.linkedin.com'

image

How to reproduce

1: Set up new app on Linkedin, add "Sign In with LinkedIn using OpenID Connect" as a product.
2: Add authentication provider for Linkedin:

import LinkedIn from "next-auth/providers/linkedin"

export const authOptions = {
    secret: 'NOT SO SECRET ANYMORE',
    providers: [
        LinkedIn({
            clientId: process.env.LINKEDIN_ID,
            clientSecret: process.env.LINKEDIN_SECRET,
            authorization: { params: { scope: 'openid profile email' } },
        })
    ], pages: {
        signIn: '/register-cv'
    },
}
export default `NextAuth(authOptions);
@andersengenolsen andersengenolsen added bug Something isn't working triage Unseen or unconfirmed by a maintainer yet. Provide extra information in the meantime. labels Oct 10, 2023
@andersengenolsen
Copy link
Author

andersengenolsen commented Oct 11, 2023

SOLVED

After some debugging I managed to solve this. In case anyone else stumbles across this, since it's not well documented:

If you're using Linkedin API V2, you do need to add some custom parameters to the Linkedin provider. The original issue was that the expected iss was undefined. Simply add issuer to OAuthConfig for the Linkedin provider:

issuer: 'https://www.linkedin.com'

This triggers a new error: 'jwks_uri must be configured on the issuer'. Add jwks_endpoint to OAuthConfig:

jwks_endpoint: 'https://www.linkedin.com/oauth/openid/jwks'

Again, this triggers a new error, where nextauth complains that the profile id is missing. Linkedin API V2 use "sub" not "id". Solved by overriding the profile function in OAuthConfig:

             return {
                    id: profile.sub,
                    name: profile.name,
                    firstname: profile.given_name,
                    lastname: profile.family_name,
                    email: profile.email,
                    image: profile.picture,
                }
            }

Complete working provider for Linkedin using Linkedin API V2:

LinkedIn({
            clientId: process.env.LINKEDIN_ID,
            clientSecret: process.env.LINKEDIN_SECRET,
            authorization: { params: { scope: 'profile email openid' } },
            issuer: 'https://www.linkedin.com',
            jwks_endpoint: "https://www.linkedin.com/oauth/openid/jwks",
            async profile(profile) {
                return {
                    id: profile.sub,
                    name: profile.name,
                    firstname: profile.given_name,
                    lastname: profile.family_name,
                    email: profile.email
                }
            },
        })

@goerlitz
Copy link
Contributor

This issue should be opened again, because every new app using SignIn with Linked will run into this issue (as I did).

Reason: Microsoft has deprecated the old API as of August 1, 2023!

I'd suggest to keep the current LinkedIn provider as is (for all apps using the legacy API), but add a new LinkedInV2 provider for all new apps using the SignIn with OpenID Connect.

Deprecated API:

LinkedIn_deprecated
LinkedIn_deplrecated_scopes

New API

LinkedIn_new
LinkedIn_new_scopes

@andersengenolsen
Copy link
Author

andersengenolsen commented Oct 20, 2023

Hi,

Fair point. Closed since I managed to solve it by setting some custom parameters, although I used quite some time on it. Reopening.

Either way: Did you manage to get it to work using the provided solution?

@goerlitz
Copy link
Contributor

Yes, your solution works great. It saved me a lot of time digging deeper myself. :)

@jormaj
Copy link

jormaj commented Oct 20, 2023

Is it still working for you guys? Even with the snippet posted, I'm still getting an error:
error: invalid_client, error_description: Client authentication failed

(I've double checked the client_id and client_secret multiple times already..

@andersengenolsen
Copy link
Author

Is it still working for you guys? Even with the snippet posted, I'm still getting an error: error: invalid_client, error_description: Client authentication failed

(I've double checked the client_id and client_secret multiple times already..

It's working. Can you please provide the complete code of [...nextauth.js]? Remember to remove ids and secrets.

@jormaj
Copy link

jormaj commented Oct 20, 2023

Thanks for you reply :)
I got one step 'further': I was using auth.js version 0.12.0. After updating to 0.17.0, I'm now getting a different error:

[mf:inf] GET /auth/csrf 200 OK (1ms)
Called .text() on an HTTP body which does not appear to be text. The body's Content-Type is "application/x-www-form-urlencoded". The result will probably be corrupted. Consider checking the Content-Type header before interpreting entities as text.
[auth][error][SignInError]: Read more at https://errors.authjs.dev#signinerror
[auth][cause]: OperationProcessingError: "response" is not a conform Authorization Server Metadata response
    at processDiscoveryResponse (file:///tmp/tmp-17164-QJe0X481iy9Q/hqlw55rde5g.js:5277:11)
    at getAuthorizationUrl (file:///tmp/tmp-17164-QJe0X481iy9Q/hqlw55rde5g.js:6903:23)
    at async signin (file:///tmp/tmp-17164-QJe0X481iy9Q/hqlw55rde5g.js:6966:14)
    at async AuthInternal (file:///tmp/tmp-17164-QJe0X481iy9Q/hqlw55rde5g.js:7144:27)
    at async Auth (file:///tmp/tmp-17164-QJe0X481iy9Q/hqlw55rde5g.js:7240:28)
    at async respond (file:///tmp/tmp-17164-QJe0X481iy9Q/hqlw55rde5g.js:17685:22)
    at async Object.fetch (file:///tmp/tmp-17164-QJe0X481iy9Q/hqlw55rde5g.js:18172:13)
    at async jsonError (file:///tmp/tmp-17164-QJe0X481iy9Q/hqlw55rde5g.js:18195:12)
    at async jsonError2 (file:///tmp/tmp-17164-QJe0X481iy9Q/hqlw55rde5g.js:18373:12)
[auth][details]: {
  "provider": "linkedin"
}
[mf:inf] POST /auth/signin/linkedin 200 OK (133ms)
[mf:inf] GET /auth/signin 200 OK (2ms)

My code:

SvelteKitAuth(async (event) => {
    const authOptions = {
      providers: [GitHub({
        clientId: GITHUB_ID, clientSecret: GITHUB_SECRET
      }),
      Google({ clientId: GOOGLE_CLIENT_ID, clientSecret: GOOGLE_CLIENT_SECRET }),
      Facebook({ clientId: FACEBOOK_CLIENT_ID, clientSecret: FACEBOOK_CLIENT_SECRET }),
      LinkedIn({
        clientId: LINKEDIN_CLIENT_ID,
        clientSecret: LINKEDIN_CLIENT_SECRET,
        authorization: { params: { scope: 'profile email openid' } },
        issuer: 'https://www.linkedin.com',
        jwks_endpoint: "https://www.linkedin.com/oauth/openid/jwks",
        async profile(profile) {
          return {
            id: profile.sub,
            name: profile.name,
            firstname: profile.given_name,
            lastname: profile.family_name,
            email: profile.email
          }
        },
      })
      ],
      secret: AUTH_SECRET,
      trustHost: true,
      ...
      }
      ```

@goerlitz
Copy link
Contributor

I'm using "next-auth": "^4.23.2" - not sure what that auth.js 0.17.0 dependency is.

@bholagabbar
Copy link

SOLVED

After some debugging I managed to solve this. In case anyone else stumbles across this, since it's not well documented:

If you're using Linkedin API V2, you do need to add some custom parameters to the Linkedin provider. The original issue was that the expected iss was undefined. Simply add issuer to OAuthConfig for the Linkedin provider:

issuer: 'https://www.linkedin.com'

This triggers a new error: 'jwks_uri must be configured on the issuer'. Add jwks_endpoint to OAuthConfig:

jwks_endpoint: 'https://www.linkedin.com/oauth/openid/jwks'

Again, this triggers a new error, where nextauth complains that the profile id is missing. Linkedin API V2 use "sub" not "id". Solved by overriding the profile function in OAuthConfig:

             return {
                    id: profile.sub,
                    name: profile.name,
                    firstname: profile.given_name,
                    lastname: profile.family_name,
                    email: profile.email,
                    image: profile.picture,
                }
            }

Complete working provider for Linkedin using Linkedin API V2:

LinkedIn({
            clientId: process.env.LINKEDIN_ID,
            clientSecret: process.env.LINKEDIN_SECRET,
            authorization: { params: { scope: 'profile email openid' } },
            issuer: 'https://www.linkedin.com',
            jwks_endpoint: "https://www.linkedin.com/oauth/openid/jwks",
            async profile(profile) {
                return {
                    id: profile.sub,
                    name: profile.name,
                    firstname: profile.given_name,
                    lastname: profile.family_name,
                    email: profile.email
                }
            },
        })

God bless, this is the right solution and docs should be updated

@mehul1011
Copy link

@andersengenolsen
If you have looked into the API deeply, what is the "sub" prop being returned by them in the response, and how can it be further used?
Also, there is any way to know the users' actual LinkedIn ID (for example: personx is the user ID below)?
https://linkedin.com/personx/

@andersengenolsen
Copy link
Author

andersengenolsen commented Oct 22, 2023

@andersengenolsen If you have looked into the API deeply, what is the "sub" prop being returned by them in the response, and how can it be further used? Also, there is any way to know the users' actual LinkedIn ID (for example: personx is the user ID below)? https://linkedin.com/personx/

Hi,

The sub parameter is an unique user identifier issued "within" the ID token (JWT) from Linkedin API V2 after authenticating. It's simply the user ID.

Documentation available here: https://learn.microsoft.com/en-us/linkedin/consumer/

Also a bit out of scope, since we're discussing Nextauth.. :)

@mehul1011
Copy link

@andersengenolsen If you have looked into the API deeply, what is the "sub" prop being returned by them in the response, and how can it be further used? Also, there is any way to know the users' actual LinkedIn ID (for example: personx is the user ID below)? https://linkedin.com/personx/

Hi,

The sub parameter is simply an unique user identifier issued "within" the ID token (JWT) from Linkedin API V2 after authenticating.

The latter seems to be a bit out of scope. Documentation available here: https://learn.microsoft.com/en-us/linkedin/consumer/

Thanks for you response

Basically they have restricted most of the api to a normal developer i believe?
Like for example getting user profile information, also communication api

@GustavoContreiras
Copy link

GustavoContreiras commented Nov 6, 2023

I'm still receiving

[next-auth][error][OAUTH_CALLBACK_ERROR] 
https://next-auth.js.org/errors#oauth_callback_error read ECONNRESET {
  error: Error: read ECONNRESET
      at TLSWrap.onStreamRead (node:internal/stream_base_commons:217:20)
      at TLSWrap.callbackTrampoline (node:internal/async_hooks:130:17) {
    name: 'OAuthCallbackError',
    code: 'ECONNRESET'
  },
  providerId: 'linkedin',
  message: 'read ECONNRESET'
}
"next": "^13.5.6",
"next-auth": "^4.24.4",
node 18.18.2
npm 9.8.1

Edit: This is working for me but I'm still receiving OAuthCallbackError intermittently.

LinkedinProvider({
	clientId: process.env.LINKEDIN_CLIENT_ID || '',
	clientSecret: process.env.LINKEDIN_CLIENT_SECRET || '',
	issuer: "https://www.linkedin.com",
	userinfo: {
		url: 'https://api.linkedin.com/v2/userinfo',
	},
	authorization: {
		url: 'https://www.linkedin.com/oauth/v2/authorization',
		params: {
			scope: 'profile email openid',
			prompt: "consent",
			access_type: "offline",
			response_type: 'code'
		},
	},
	token: {
		url: 'https://www.linkedin.com/oauth/v2/accessToken',
	},
	jwks_endpoint: "https://www.linkedin.com/oauth/openid/jwks",
	profile(profile, tokens) {
		const defaultImage = 'https://cdn-icons-png.flaticon.com/512/174/174857.png';
		return {
			id: profile.sub,
			name: profile.name,
			email: profile.email,
			image: profile.picture ?? defaultImage,
		};
	},
})

If you want to use it with an adapter you will need to increase the access_token default column length because Linkedin's access_token has more than 255 characters.

@AnatoleT
Copy link

AnatoleT commented Nov 8, 2023

Is it still working for you guys? Even with the snippet posted, I'm still getting an error: error: invalid_client, error_description: Client authentication failed

(I've double checked the client_id and client_secret multiple times already..

Hi @jormaj , did you find a workaround for this ? I'm facing the same error..

@benjamindell
Copy link

Has anyone resolved this? I'm also getting the invalid_client error and can't work out why.

@AmitSahoo45
Copy link

I tried the same code in my route.ts inside app/api/auth/[...nextauth] folder:

LinkedInProvider({
            clientId: process.env.LINKEDIN_CLIENT_ID as string,
            clientSecret: process.env.LINKEDIN_CLIENT_SECRET as string,
            authorization: { params: { scope: 'openid profile email' } },
            issuer: 'https://www.linkedin.com',
            jwks_endpoint: "https://www.linkedin.com/oauth/openid/jwks",
            async profile(profile) {
                return {
                    id: profile.sub,
                    name: profile.name,
                    firstname: profile.given_name,
                    lastname: profile.family_name,
                    email: profile.email
                }
            },
        })
    ],

yet still I am running into this error
image

@goerlitz
Copy link
Contributor

goerlitz commented Dec 1, 2023

Please read the error message completely.
It says "The redirect_uri does not match the registered"
It means that the callbackUrl you passed as parameter in you signIn() function call is not known to LinkedIn. You need to add it to you configuration in LinkedIn.

@AmitSahoo45
Copy link

Thanks. Resolved it. 👍🏻

@balazsorban44
Copy link
Member

Hi everyone, I'm looking into this now. I think I found a bug in the LinkedIn OIDC implementation, I reached out to them and awaiting response.

@balazsorban44 balazsorban44 added providers and removed triage Unseen or unconfirmed by a maintainer yet. Provide extra information in the meantime. labels Dec 12, 2023
@benjamindell
Copy link

Hi everyone, I'm looking into this now. I think I found a bug in the LinkedIn OIDC implementation, I reached out to them and awaiting response.

Ah fantastic! Thanks for looking into this. Can confirm it's still an issue at my end.

@hexcowboy
Copy link

Hi everyone, I'm looking into this now. I think I found a bug in the LinkedIn OIDC implementation, I reached out to them and awaiting response.

is this in reference to this error message?

[auth][error] OperationProcessingError: "response" is not a conform Authorization Server Metadata response

because i'm also coming to the same conclusion

@lovinzoop
Copy link

lovinzoop commented Dec 19, 2023

SOLVED

After some debugging I managed to solve this. In case anyone else stumbles across this, since it's not well documented:
If you're using Linkedin API V2, you do need to add some custom parameters to the Linkedin provider. The original issue was that the expected iss was undefined. Simply add issuer to OAuthConfig for the Linkedin provider:
issuer: 'https://www.linkedin.com'
This triggers a new error: 'jwks_uri must be configured on the issuer'. Add jwks_endpoint to OAuthConfig:
jwks_endpoint: 'https://www.linkedin.com/oauth/openid/jwks'
Again, this triggers a new error, where nextauth complains that the profile id is missing. Linkedin API V2 use "sub" not "id". Solved by overriding the profile function in OAuthConfig:

             return {
                    id: profile.sub,
                    name: profile.name,
                    firstname: profile.given_name,
                    lastname: profile.family_name,
                    email: profile.email,
                    image: profile.picture,
                }
            }

Complete working provider for Linkedin using Linkedin API V2:

LinkedIn({
            clientId: process.env.LINKEDIN_ID,
            clientSecret: process.env.LINKEDIN_SECRET,
            authorization: { params: { scope: 'profile email openid' } },
            issuer: 'https://www.linkedin.com',
            jwks_endpoint: "https://www.linkedin.com/oauth/openid/jwks",
            async profile(profile) {
                return {
                    id: profile.sub,
                    name: profile.name,
                    firstname: profile.given_name,
                    lastname: profile.family_name,
                    email: profile.email
                }
            },
        })

God bless, this is the right solution and docs should be updated

I tried this exact same configuration in LinkedInProvider, but I am not getting user information.
image
image
In the signIn callback, console the response
image

It's not giving any error, but I want user info like email, name etc
I am using next-auth 4.22.3

@deibyrios
Copy link

@alxwest not really. I’m not sure if @balazsorban44 is still working with LinkedIn for a fix. The other option option would be for someone to work on the conform() method but that’s beyond my current knowledge so, I guess we will have to dig into the issue and hack around Auth.JS to work, even with LinkedIn not being OIDC spec compliant.

@cocoBavan
Copy link

cocoBavan commented Feb 28, 2024

Putting logs inside node module files and patching things, I managed to get this far.

LinkedInProvider({
      clientId: process.env.LINKEDIN_CLIENT_ID,
      clientSecret: process.env.LINKEDIN_CLIENT_SECRET,
      authorization: {
        url: "https://www.linkedin.com/oauth/v2/authorization",
        params: { scope: "profile email openid" },
      },
      token: {
        url: "https://www.linkedin.com/oauth/v2/accessToken",
      },
      userinfo: {
        url: "https://api.linkedin.com/v2/userinfo",
      },
    })

But, it fails with the Error: TODO: Handle OIDC response body error. So, I believe the token returned is not correct and needs to fixed by Linked In?

@Shashwat61
Copy link

Putting logs inside node module files and patching things, I managed to get this far.

LinkedInProvider({
      clientId: process.env.LINKEDIN_CLIENT_ID,
      clientSecret: process.env.LINKEDIN_CLIENT_SECRET,
      authorization: {
        url: "https://www.linkedin.com/oauth/v2/authorization",
        params: { scope: "profile email openid" },
      },
      token: {
        url: "https://www.linkedin.com/oauth/v2/accessToken",
      },
      userinfo: {
        url: "https://api.linkedin.com/v2/userinfo",
      },
    })

But, it fails with the Error: TODO: Handle OIDC response body error. So, I believe the token returned is not correct and needs to fixed by Linked In?

stuck at this point too

@paschalidi
Copy link

paschalidi commented Mar 5, 2024

This has worked for me

export const authOptions: AuthOptions = {
 .
 .
 providers: [
    LinkedInProvider({
      clientId: process.env.LINKEDIN_CLIENT_ID!,
      clientSecret: process.env.LINKEDIN_CLIENT_SECRET!,
      client: { token_endpoint_auth_method: 'client_secret_post' },
      authorization: {
        url: 'https://www.linkedin.com/oauth/v2/authorization',
        params: { scope: 'openid profile email' }
      },
      wellKnown:
        'https://www.linkedin.com/oauth/.well-known/openid-configuration',
      issuer: 'https://www.linkedin.com',
      jwks_endpoint: 'https://www.linkedin.com/oauth/openid/jwks',
      async profile(profile: LinkedInProfile) {
        return {
          id: profile.sub,
          name: `${profile.given_name} ${profile.family_name}`,
          email: profile.email
        };
      }
    }),
  ]
 . 
 .

With auth scopes
image

And my application is not verified yet

@cocoBavan
Copy link

This has worked for me
And my application is not verified yet

@paschalidi I tried with those settings. Still doesn't work. May be you created this app a few months back? Could you please post the Products page? Mine looks like this.

Screenshot 2024-03-05 at 5 17 17 pm

@paschalidi
Copy link

I only created it yesterday.

image

@cocoBavan
Copy link

@paschalidi Good for you. I even created a new one and tried it. Still the same error. Maybe the version of the next Auth or some other libraries has something to do with it?

@som-nitjsr
Copy link

check the latest code LinkedIn openid connect implementation. currently, there are not support the code_verfier parameter and claim dose not return noce.
by setting these two parameter shoud work.

options.UsePkce = false;
options.ProtocolValidator.RequireNonce = false;

@paramaggarwal
Copy link
Contributor

paramaggarwal commented Mar 9, 2024

@balazsorban44 I understand that auto discovery does not work as of today due to the mismatch in issuer and wellKnown from LinkedIn's side. But we should be able to bypass discovery and manually configure the endpoints in the default LinkedIn config of the library.

authorization: {
  url: "https://www.linkedin.com/oauth/v2/authorization",
  params: { scope: "openid profile email" },
},
token: {
  url: "https://www.linkedin.com/oauth/v2/accessToken",
},
userinfo: {
  url: "https://api.linkedin.com/v2/userinfo",
},

This should have worked. But @cocoBavan and @Shashwat61 and myself are all stuck at this stage with error:

Error: TODO: Handle OIDC response body error

error {
   error: 'invalid_client',
   error_description: 'Client authentication failed'
}

GET /api/auth/callback/linkedin?code=(code) 302 in 522ms
... POST https://www.linkedin.com/oauth/v2/accessToken 401 in 479ms

On checking the details of the request for /v2/accessToken, I can see that there is a field code_verifier going which when removed the API call works successfully.

As mentioned by @som-nitjsr, this code_verifier parameter is not supported, but it is not clear how to disable PKCE.

@balazsmeszegeto
Copy link

check the latest code LinkedIn openid connect implementation. currently, there are not support the code_verfier parameter and claim dose not return noce. by setting these two parameter shoud work.

options.UsePkce = false;
options.ProtocolValidator.RequireNonce = false;

@som-nitjsr Where did you get this from? It is correct, just asking for the source

@som-nitjsr
Copy link

check the latest code LinkedIn openid connect implementation. currently, there are not support the code_verfier parameter and claim dose not return noce. by setting these two parameter shoud work.

options.UsePkce = false;
options.ProtocolValidator.RequireNonce = false;

@som-nitjsr Where did you get this from? It is correct, just asking for the source

I have used c# .net core and this is how i have integrated.

let me know which framework you are uisng
.AddOpenIdConnect("LinkedIn", "LinkedIn", options =>
{

 options.Authority = "https://www.linkedin.com/oauth/";
 options.CallbackPath = "/signin-linkedin";
 options.ClientId = "clinetid";
 options.ClientSecret = "code";
 options.ResponseType = "code";
 options.Scope.Add("openid");
 options.Scope.Add("profile");
 options.Scope.Add("email");
 options.ProtocolValidator.RequireNonce = false;
 options.Events = new OpenIdConnectEvents
 {
     OnAuthorizationCodeReceived = async context =>
     {
         // Remove the 'code_verifier' parameter
         context.TokenEndpointRequest.Parameters.Remove("code_verifier");
         await Task.CompletedTask;
     }
 };

});

@som-nitjsr
Copy link

also you can refer the c# code here where linkedin is connected uisng idp https://github.com/som-nitjsr/linkedidp

@balazsmeszegeto
Copy link

I am using ASP.NET Core, but couldn't figure out why PKCE would result in invalid_client error on token endpoint. Searching for the solution is how I ended up here and wanted to confirm, that it does indeed solve the issue.

check the latest code LinkedIn openid connect implementation. currently, there are not support the code_verfier parameter and claim dose not return noce. by setting these two parameter shoud work.

options.UsePkce = false;
options.ProtocolValidator.RequireNonce = false;

Furthermore, when you said: "check the latest code LinkedIn openid connect implementation" - I had the impression is that you're referring to an official or other publicly available implementation, so that's why I was asking for the source (the origin). Do you have that or did you figure this out on your own?

@som-nitjsr
Copy link

@balazsmeszegeto
i tested the token endpoint by passing the different parameters and figured out that code_verifer is not supported.

you can also see that they dont support nonce claim from here https://www.linkedin.com/oauth/.well-known/openid-configuration?_l=en_US

based on these i have written a solution here https://github.com/som-nitjsr/linkedidp

@balazsmeszegeto
Copy link

Great job then!

Still, I'd consider this as a bug in LinkedIn side, since nonce is mandatory as per OpenID C standard, and not an optional claim

@pranavmappoli
Copy link

pranavmappoli commented Apr 13, 2024

Anyone find the final solution, still facing same error

@kafiln
Copy link

kafiln commented Apr 15, 2024

Anyone with a workaround for this ?

@AbdelrahmanSadat
Copy link

AbdelrahmanSadat commented Apr 18, 2024

In case anyone comes across it, I had the same workaround in my codebase, until a different but similar error started showing:
https://next-auth.js.org/errors#oauth_callback_error unexpected iss value, expected https://www.linkedin.com, got: https://www.linkedin.com/oauth

I set issuer: 'https://www.linkedin.com/oauth' in the LinkedInProvider instead of issuer: 'https://www.linkedin.com', and the error is resolved.

@mfts
Copy link

mfts commented Apr 21, 2024

I set issuer: 'https://www.linkedin.com/oauth' in the LinkedInProvider instead of issuer: 'https://www.linkedin.com', and the error is resolved.

I can confirm this also worked for me. Must be a recent change in the API.

@balazsorban44
Copy link
Member

Oh, it certainly is, I haven't gotten back a confirmation from them, but been asking for this for a while. Will fix it soon, now!

@ndom91
Copy link
Member

ndom91 commented Apr 21, 2024

Put up a PR with the issuer update: #10671

@wowtah
Copy link

wowtah commented Apr 22, 2024

Did anybody get LinkedIn working for NextAuth.js v5?

With my current code, I get the LinkedIn login page, and a LinkedIn page where I press 'Allow' (this also shows it will redirect to localhost). After choosing Allow, my browser (now on http://localhost:3000/api/auth/error?error=Configuration) shows:

Server error
There is a problem with the server configuration.
Check the server logs for more information.

My logging shows:

GET /api/auth/signin 200 in 9ms
 POST /api/auth/signin/linkedin 302 in 32ms
error {
  error: 'invalid_client',
  error_description: 'Client authentication failed'
}
[auth][error] CallbackRouteError: Read more at https://errors.authjs.dev#callbackrouteerror
[auth][cause]: Error: TODO: Handle OIDC response body error
    at handleOAuth (webpack-internal:///(rsc)/./node_modules/next-auth/node_modules/@auth/core/lib/actions/callback/oauth/callback.js:86:19)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Module.callback (webpack-internal:///(rsc)/./node_modules/next-auth/node_modules/@auth/core/lib/actions/callback/index.js:32:41)
    at async AuthInternal (webpack-internal:///(rsc)/./node_modules/next-auth/node_modules/@auth/core/lib/index.js:39:24)
    at async Auth (webpack-internal:///(rsc)/./node_modules/next-auth/node_modules/@auth/core/index.js:126:34)
    at async C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:53191
    at async e_.execute (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:44492)
    at async e_.handle (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:54445)
    at async doRender (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\base-server.js:1377:42)
    at async cacheEntry.responseCache.get.routeKind (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\base-server.js:1587:40)
    at async DevServer.renderToResponseWithComponentsImpl (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\base-server.js:1507:28)
    at async DevServer.renderPageComponent (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\base-server.js:1924:24)
    at async DevServer.renderToResponseImpl (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\base-server.js:1962:32)
    at async DevServer.pipeImpl (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\base-server.js:920:25)
    at async NextNodeServer.handleCatchallRenderRequest (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\next-server.js:272:17)
    at async DevServer.handleRequestImpl (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\base-server.js:816:17)
    at async C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\dev\next-dev-server.js:339:20
    at async Span.traceAsyncFn (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\trace\trace.js:154:20)
    at async DevServer.handleRequest (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\dev\next-dev-server.js:336:24)
    at async invokeRender (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\lib\router-server.js:174:21)
    at async handleRequest (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\lib\router-server.js:353:24)
    at async requestHandlerImpl (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\lib\router-server.js:377:13)
    at async Server.requestListener (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\lib\start-server.js:141:13)
[auth][details]: {
  "provider": "linkedin"
}
 GET /api/auth/callback/linkedin?code=AQQzoxG4FredactedzW8aWageredactedYYmUsHXW3FsgQ9NbredactedwbF8D-TNbs_rdIbCbredactednZ_Dgy2RCZUBUYynredacteddICqBDJNBJhqUtFDDUWCEopZ-oypAH4gni5gN_PRnzmbh1OGgJP8NoxnUnhcAltC0oYz4_f5nA5ipY 302 in 319ms
 GET /api/auth/error?error=Configuration 500 in 12ms

I tried many variants of this code, some resulting in different errors. But still havent seen it working.

LinkedInProvider({
        clientId: process.env.LINKEDIN_CLIENT_ID!,
        clientSecret: process.env.LINKEDIN_CLIENT_SECRET!,
        client: { token_endpoint_auth_method: 'client_secret_post',  },
        authorization: {
          url: 'https://www.linkedin.com/oauth/v2/authorization',
          params: { scope: 'openid profile email' }
        },
        token: {
          url: 'https://www.linkedin.com/oauth/v2/accessToken',
        },
        wellKnown:
          'https://www.linkedin.com/oauth/.well-known/openid-configuration',
          userinfo: {
            url: 'https://api.linkedin.com/v2/userinfo',
            params: {
              projection: ``,
            },
          },
        issuer: 'https://www.linkedin.com/oauth',
        jwks_endpoint: 'https://www.linkedin.com/oauth/openid/jwks',
                
        profile(profile: LinkedInProfile) {
          return {
            id: profile.sub,
            firstName: profile.given_name,
            lastName: profile.family_name,
            email: profile.email,
            image: profile.picture,
          };
        },
        allowDangerousEmailAccountLinking: true
     
    })

I got it working for GitHub, so I am confident that my base setup is correct.
The versions I am using:

"@auth/core": "^0.30.0",
"@auth/prisma-adapter": "^2.0.0",
"next": "^14.2.2",
"next-auth": "^5.0.0-beta.16",

I am posting this here since this thread seems very relevant. Any help is appreciated :)

@kafiln
Copy link

kafiln commented Apr 22, 2024

Did anybody got LinkedIn working for NextAuth.js v5?

With my current code, I get the LinkedIn login page, and a LinkedIn page where I press 'Allow' (this also shows it will redirect to localhost). After choosing Allow, my browser (now on http://localhost:3000/api/auth/error?error=Configuration) shows:

Server error There is a problem with the server configuration. Check the server logs for more information.

My logging shows:

GET /api/auth/signin 200 in 9ms
 POST /api/auth/signin/linkedin 302 in 32ms
error {
  error: 'invalid_client',
  error_description: 'Client authentication failed'
}
[auth][error] CallbackRouteError: Read more at https://errors.authjs.dev#callbackrouteerror
[auth][cause]: Error: TODO: Handle OIDC response body error
    at handleOAuth (webpack-internal:///(rsc)/./node_modules/next-auth/node_modules/@auth/core/lib/actions/callback/oauth/callback.js:86:19)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Module.callback (webpack-internal:///(rsc)/./node_modules/next-auth/node_modules/@auth/core/lib/actions/callback/index.js:32:41)
    at async AuthInternal (webpack-internal:///(rsc)/./node_modules/next-auth/node_modules/@auth/core/lib/index.js:39:24)
    at async Auth (webpack-internal:///(rsc)/./node_modules/next-auth/node_modules/@auth/core/index.js:126:34)
    at async C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:53191
    at async e_.execute (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:44492)
    at async e_.handle (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:54445)
    at async doRender (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\base-server.js:1377:42)
    at async cacheEntry.responseCache.get.routeKind (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\base-server.js:1587:40)
    at async DevServer.renderToResponseWithComponentsImpl (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\base-server.js:1507:28)
    at async DevServer.renderPageComponent (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\base-server.js:1924:24)
    at async DevServer.renderToResponseImpl (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\base-server.js:1962:32)
    at async DevServer.pipeImpl (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\base-server.js:920:25)
    at async NextNodeServer.handleCatchallRenderRequest (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\next-server.js:272:17)
    at async DevServer.handleRequestImpl (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\base-server.js:816:17)
    at async C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\dev\next-dev-server.js:339:20
    at async Span.traceAsyncFn (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\trace\trace.js:154:20)
    at async DevServer.handleRequest (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\dev\next-dev-server.js:336:24)
    at async invokeRender (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\lib\router-server.js:174:21)
    at async handleRequest (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\lib\router-server.js:353:24)
    at async requestHandlerImpl (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\lib\router-server.js:377:13)
    at async Server.requestListener (C:\Users\Wouter\source\repos\nxt14\node_modules\next\dist\server\lib\start-server.js:141:13)
[auth][details]: {
  "provider": "linkedin"
}
 GET /api/auth/callback/linkedin?code=AQQzoxG4FredactedzW8aWageredactedYYmUsHXW3FsgQ9NbredactedwbF8D-TNbs_rdIbCbredactednZ_Dgy2RCZUBUYynredacteddICqBDJNBJhqUtFDDUWCEopZ-oypAH4gni5gN_PRnzmbh1OGgJP8NoxnUnhcAltC0oYz4_f5nA5ipY 302 in 319ms
 GET /api/auth/error?error=Configuration 500 in 12ms

I tried many variants of this code, some resulting in different errors. But still havent seen it working.

LinkedInProvider({
        clientId: process.env.LINKEDIN_CLIENT_ID!,
        clientSecret: process.env.LINKEDIN_CLIENT_SECRET!,
        client: { token_endpoint_auth_method: 'client_secret_post',  },
        authorization: {
          url: 'https://www.linkedin.com/oauth/v2/authorization',
          params: { scope: 'openid profile email' }
        },
        token: {
          url: 'https://www.linkedin.com/oauth/v2/accessToken',
        },
        wellKnown:
          'https://www.linkedin.com/oauth/.well-known/openid-configuration',
          userinfo: {
            url: 'https://api.linkedin.com/v2/userinfo',
            params: {
              projection: ``,
            },
          },
        issuer: 'https://www.linkedin.com/oauth',
        jwks_endpoint: 'https://www.linkedin.com/oauth/openid/jwks',
                
        profile(profile: LinkedInProfile) {
          return {
            id: profile.sub,
            firstName: profile.given_name,
            lastName: profile.family_name,
            email: profile.email,
            image: profile.picture,
          };
        },
        allowDangerousEmailAccountLinking: true
     
    })

I got it working for GitHub, so I am confident that my base setup is correct. The versions I am using:

"@auth/core": "^0.30.0",
"@auth/prisma-adapter": "^2.0.0",
"next": "^14.2.2",
"next-auth": "^5.0.0-beta.16",

I am posting this here since this thread seems very relevant. Any help is appreciated :)

I am in the exact same situation.

@Starefossen
Copy link

Starefossen commented Apr 29, 2024

Same configuration as @kafiln and @wowtah with the following error after callback from LinkedIn:

 POST /api/auth/signin/linkedin 302 in 24ms                                                                                       error {                                                          
  error: 'invalid_client',                                                                                                          error_description: 'Client authentication failed'
}                                                                                                                                 [auth][error] CallbackRouteError: Read more at https://errors.authjs.dev#callbackrouteerror
[auth][cause]: Error: TODO: Handle OIDC response body error 

Config:

export const config = {
  providers: [
    GitHub({
      clientId: process.env.AUTH_GITHUB_ID,
      clientSecret: process.env.AUTH_GITHUB_SECRET,
      authorization: { params: { scope: 'openid profile email' } },
    }),
    LinkedIn({
      clientId: process.env.AUTH_LINKEDIN_ID!,
      clientSecret: process.env.AUTH_LINKEDIN_SECRET!,
      authorization: {
        url: 'https://www.linkedin.com/oauth/v2/authorization',
        params: { scope: 'openid profile email' }
      },
      issuer: "https://www.linkedin.com/oauth",
   })
  ]
}

GitHub auth works as expected.

@Ranjanlc
Copy link

Ranjanlc commented May 1, 2024

Still facing this issue. Am I doing something wrong? As there are lots of solutions in this thread, still unsure what is the correct one. This is my LinkedIn provider and I have latest version of next-auth 4.24.7

And this is my linkedIn provider config:

    LinkedInProvider({
        clientId: process.env.LINKEDIN_CLIENT_ID || "",
        clientSecret: process.env.LINKEDIN_CLIENT_SECRET || "",
        client: { token_endpoint_auth_method: "client_secret_post" },
        authorization: {
          url: "https://www.linkedin.com/oauth/v2/authorization",
          params: { scope: "openid profile email" },
        },
        token: {
          url: "https://www.linkedin.com/oauth/v2/accessToken",
        },
        userinfo: {
          url: "https://api.linkedin.com/v2/userinfo",
        },
        wellKnown:
          "https://www.linkedin.com/oauth/.well-known/openid-configuration",
        issuer: "https://www.linkedin.com/oauth",
        jwks_endpoint: "https://www.linkedin.com/oauth/openid/jwks",
        profile(profile) {
          const defaultImage =
            "https://cdn-icons-png.flaticon.com/512/174/174857.png";
          return {
            id: profile.sub,
            name: profile.name,
            email: profile.email,
            image: profile.picture ?? defaultImage,
          };
        },
      }),

ERROR:

[next-auth][error][OAUTH_CALLBACK_ERROR] 
https://next-auth.js.org/errors#oauth_callback_error id_token detected in the response, you must use client.callback() instead of client.oauthCallback() {
  error: RPError: id_token detected in the response, you must use client.callback() instead of client.oauthCallback() 
      at Client.oauthCallback (C:\Users\Lenovo\Documents\new.ontourism.academy\node_modules\openid-client\lib\client.js:632:15)
      at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
      at async oAuthCallback (C:\Users\Lenovo\Documents\new.ontourism.academy\node_modules\next-auth\core\lib\oauth\callback.js:111:16)
      at async Object.callback (C:\Users\Lenovo\Documents\new.ontourism.academy\node_modules\next-auth\core\routes\callback.js:52:11)
      at async AuthHandler (C:\Users\Lenovo\Documents\new.ontourism.academy\node_modules\next-auth\core\index.js:208:28)
      at async NextAuthApiHandler (C:\Users\Lenovo\Documents\new.ontourism.academy\node_modules\next-auth\next\index.js:22:19)
      at async K (C:\Users\Lenovo\Documents\new.ontourism.academy\node_modules\next\dist\compiled\next-server\pages-api.runtime.dev.js:21:2946)
      at async U.render (C:\Users\Lenovo\Documents\new.ontourism.academy\node_modules\next\dist\compiled\next-server\pages-api.runtime.dev.js:21:3827)
      at async DevServer.runApi (C:\Users\Lenovo\Documents\new.ontourism.academy\node_modules\next\dist\server\next-server.js:554:9)
      at async NextNodeServer.handleCatchallRenderRequest (C:\Users\Lenovo\Documents\new.ontourism.academy\node_modules\next\dist\server\next-server.js:266:37)
      at async DevServer.handleRequestImpl (C:\Users\Lenovo\Documents\new.ontourism.academy\node_modules\next\dist\server\base-server.js:789:17)
      at async C:\Users\Lenovo\Documents\new.ontourism.academy\node_modules\next\dist\server\dev\next-dev-server.js:331:20
      at async Span.traceAsyncFn (C:\Users\Lenovo\Documents\new.ontourism.academy\node_modules\next\dist\trace\trace.js:151:20)
      at async DevServer.handleRequest (C:\Users\Lenovo\Documents\new.ontourism.academy\node_modules\next\dist\server\dev\next-dev-server.js:328:24)
      at async invokeRender (C:\Users\Lenovo\Documents\new.ontourism.academy\node_modules\next\dist\server\lib\router-server.js:174:21) {
    name: 'OAuthCallbackError',
    code: undefined
  },
  providerId: 'linkedin',
  message: 'id_token detected in the response, you must use client.callback() instead of client.oauthCallback()'      
}

@holgerflick
Copy link

I am also still getting an error:

[auth][error] OperationProcessingError: "response" is not a conform Authorization Server Metadata response
    at Module.processDiscoveryResponse (webpack-internal:///(rsc)/./node_modules/oauth4webapi/build/index.js:287:15)
    at getAuthorizationUrl (webpack-internal:///(rsc)/./node_modules/@auth/core/lib/actions/signin/authorization-url.js:25:68)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Module.signIn (webpack-internal:///(rsc)/./node_modules/@auth/core/lib/actions/signin/index.js:16:56)
    at async AuthInternal (webpack-internal:///(rsc)/./node_modules/@auth/core/lib/index.js:72:24)
    at async Auth (webpack-internal:///(rsc)/./node_modules/@auth/core/index.js:126:34)
    at async /Users/holger/web/next.providers/node_modules/next/dist/compiled/next-server/app-route.runtime.dev.js:6:53446
    at async e_.execute (/Users/holger/web/next.providers/node_modules/next/dist/compiled/next-server/app-route.runtime.dev.js:6:44747)
    at async e_.handle (/Users/holger/web/next.providers/node_modules/next/dist/compiled/next-server/app-route.runtime.dev.js:6:54700)
    at async doRender (/Users/holger/web/next.providers/node_modules/next/dist/server/base-server.js:1377:42)
    at async cacheEntry.responseCache.get.routeKind (/Users/holger/web/next.providers/node_modules/next/dist/server/base-server.js:1587:40)
    at async DevServer.renderToResponseWithComponentsImpl (/Users/holger/web/next.providers/node_modules/next/dist/server/base-server.js:1507:28)
    at async DevServer.renderPageComponent (/Users/holger/web/next.providers/node_modules/next/dist/server/base-server.js:1924:24)
    at async DevServer.renderToResponseImpl (/Users/holger/web/next.providers/node_modules/next/dist/server/base-server.js:1962:32)
    at async DevServer.pipeImpl (/Users/holger/web/next.providers/node_modules/next/dist/server/base-server.js:920:25)
    at async NextNodeServer.handleCatchallRenderRequest (/Users/holger/web/next.providers/node_modules/next/dist/server/next-server.js:272:17)
    at async DevServer.handleRequestImpl (/Users/holger/web/next.providers/node_modules/next/dist/server/base-server.js:816:17)
    at async /Users/holger/web/next.providers/node_modules/next/dist/server/dev/next-dev-server.js:339:20
    at async Span.traceAsyncFn (/Users/holger/web/next.providers/node_modules/next/dist/trace/trace.js:154:20)
    at async DevServer.handleRequest (/Users/holger/web/next.providers/node_modules/next/dist/server/dev/next-dev-server.js:336:24)
    at async invokeRender (/Users/holger/web/next.providers/node_modules/next/dist/server/lib/router-server.js:174:21)
    at async handleRequest (/Users/holger/web/next.providers/node_modules/next/dist/server/lib/router-server.js:353:24)
    at async requestHandlerImpl (/Users/holger/web/next.providers/node_modules/next/dist/server/lib/router-server.js:377:13)
    at async Server.requestListener (/Users/holger/web/next.providers/node_modules/next/dist/server/lib/start-server.js:141:13)
 POST /api/auth/signin/linkedin 302 in 172ms
 GET /api/auth/error?error=Configuration 500 in 5ms

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working providers upstream The issue dervies from one of next-auth dependencies
Projects
None yet