supabase / auth

A JWT based API for managing users and issuing JWT tokens
https://supabase.com/docs/guides/auth
MIT License
1.47k stars 359 forks source link

linkIdentity() does not work with React Native #1645

Open norenz92 opened 3 months ago

norenz92 commented 3 months ago

Bug report

Describe the bug

Not sure if this is a bug or just not compatible with React Native, but there is no way to use linkIdentity() with native social logins like Google, Facebook and Apple in a React Native app. Documentation does not provide any information on how to implement this.

System information

kangmingtay commented 3 months ago

no way to use linkIdentity() with native social logins like Google, Facebook and Apple in a React Native app

@norenz92 can you elaborate more on this statement? do you get some sort of error when you call linkIdentity in a react native environment?

norenz92 commented 3 months ago

no way to use linkIdentity() with native social logins like Google, Facebook and Apple in a React Native app

@norenz92 can you elaborate more on this statement? do you get some sort of error when you call linkIdentity in a react native environment?

No error. It's just that this function does not seem to be meant to use with native auth for these providers. The function returns a redirect URL which from AFAIK has no use in my case.

kangmingtay commented 3 months ago

@norenz92 it works just like signInWithOAuth(), where you need to redirect the user to the URL returned

norenz92 commented 2 months ago

@norenz92 it works just like signInWithOAuth(), where you need to redirect the user to the URL returned

I don't want to redirect the user to a browser from the app...

f-bog commented 2 months ago

@norenz92 I was confused in a similar way, you will need to utilise something like expo-web-browser to prompt open an in-app browser to handle the redirecting. This seems to be the standard way to handle social logins inside of apps.. I'm not aware of a different solution.

zwenza commented 2 months ago

Linking works also in React Native with the standard OAuth flow over the web-browser, for anyone interested, this is how I got it to work, linking the user through an in-app browser:

const { data, error } = await supabase.auth.linkIdentity({
  provider: "apple",
  options: {
    skipBrowserRedirect: true,
    redirectTo: "<YOUR_APP_DEEPLINK>",
  },
});

if (data.url) {
  await WebBrowser.openAuthSessionAsync(
    data.url,
     "<YOU_APP_DEEPLINK>"
  );
}

However I agree with @norenz92 that this could be improved. Supabase already has capabilities to support native sign-in methods on mobile platforms (see docs).

Currently I can already offer a native sign-in this way using expo-apple-authentication:

const credential = await AppleAuthentication.signInAsync({
  requestedScopes: [AppleAuthentication.AppleAuthenticationScope.EMAIL],
});

// This works for non-anonymous signups
await supabase.auth.signInWithIdToken({
  provider: "apple",
  token: credential.identityToken,
});

// This is how I would imagine linkIdentity to support native sign-ins 
 const { data, error } = await supabase.auth.linkIdentity({
  provider: "apple",
  token: credential.identityToken,   // This is currently not possible!
  options: { skipBrowserRedirect: true },
 });

Is there anything speaking against allowing us to pass the OIDC token to linkIdentity like we can already do with signInWithIdToken?