Skip to content

Commit

Permalink
feat: pkce challenge support in React Native with Segment (#772)
Browse files Browse the repository at this point in the history
## What kind of change does this PR introduce?

This PR fixes an issue where gotrue would throw in React Native due to
the lack of the crypto and TextEncoder module.

When [integrating Segment with React
Native](https://segment.com/docs/connections/sources/catalog/libraries/mobile/react-native/),
they ask you to install
[react-native-get-random-values](https://github.com/LinusU/react-native-get-random-values)
as a polyfill to crypto's `getRandomValue` method. This causes issues in
gotrue, as the code does a simple `crypto !== undefined` check.

Since a lot of RN libraries polyfill only a subset of crypto's method,
`crypto !== undefined` is not a bullet-proof way to check for support.

## What is the current behavior?

If you have Segment installed, and try to login with
`supabase.auth.signInWithOtp` (email), the app throws an error.

## What is the new behavior?

If the required crypto modules are not available, it just fallbacks to
plain text as the existing behavior instead of throwing an error.
  • Loading branch information
MarceloPrado committed Oct 5, 2023
1 parent 45b6e3e commit b4494cb
Showing 1 changed file with 3 additions and 1 deletion.
4 changes: 3 additions & 1 deletion src/lib/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,9 @@ function base64urlencode(str: string) {
}

export async function generatePKCEChallenge(verifier: string) {
if (typeof crypto === 'undefined') {
const hasCryptoSupport = typeof crypto !== 'undefined' && typeof crypto.subtle !== 'undefined' && typeof TextEncoder !== 'undefined';

if (!hasCryptoSupport) {
console.warn(
'WebCrypto API is not supported. Code challenge method will default to use plain instead of sha256.'
)
Expand Down

0 comments on commit b4494cb

Please sign in to comment.