> ## Documentation Index
> Fetch the complete documentation index at: https://docs-staging-quickstart-revamp.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> This tutorial demonstrates how to add user login to an React Native application using Auth0.

# Add Login to Your React Native Application

export const LoggedInForm = ({sampleApp}) => {
  const LS_APPS_KEY = "auth_demo_apps";
  const LS_APP_CFG_KEY = "auth_demo_app_cfg";
  const CHANNEL = "auth_flows_sync_v1";
  const mkChannel = () => new BroadcastChannel(CHANNEL);
  function uid() {
    return Math.random().toString(36).slice(2) + Date.now().toString(36);
  }
  function loadApps() {
    const raw = localStorage.getItem(LS_APPS_KEY);
    if (raw) return JSON.parse(raw);
    const seeded = [{
      id: "mz9iNEIo2PHu7oeh8QRt19ndTyyCIgai",
      name: "Default App"
    }];
    localStorage.setItem(LS_APPS_KEY, JSON.stringify(seeded));
    return seeded;
  }
  function saveApps(apps) {
    localStorage.setItem(LS_APPS_KEY, JSON.stringify(apps));
  }
  function loadCfg() {
    const raw = localStorage.getItem(LS_APP_CFG_KEY);
    return raw ? JSON.parse(raw) : {};
  }
  function saveCfg(cfg) {
    localStorage.setItem(LS_APP_CFG_KEY, JSON.stringify(cfg));
  }
  const RightChevron = ({className = "w-5 h-5", ...props}) => <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke="currentColor" fill="none" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className={className} {...props}>
      <polyline points="9 18 15 12 9 6" />
    </svg>;
  const LightningIcon = () => <svg width="24" height="24" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
      <path fillRule="evenodd" clipRule="evenodd" className="fill-[#3F59E4] dark:fill-[#99A7F1]" d="M24.971 30.152H7.088c-1.786 0-2.745-2.103-1.574-3.453l19.07-21.988c1.33-1.532 3.835-.4 3.569 1.607L24.97 30.152z" />
      <path fillRule="evenodd" clipRule="evenodd" className="fill-[#3F59E4] dark:fill-[#99A7F1]" d="M23.201 17.885h17.885c1.787 0 2.746 2.102 1.575 3.453l-19.073 21.99c-1.33 1.532-3.835.4-3.568-1.607L23.2 17.885z" />
    </svg>;
  const LayersIcon = () => <svg width="24" height="24" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
      <path className="fill-[#3F59E4] dark:fill-[#99A7F1]" d="M34.54 29.135l6.373 3.183c1.566.782 1.566 3.017 0 3.8l-14.815 7.396a4.623 4.623 0 01-4.125 0L7.174 36.12c-1.565-.782-1.565-3.017 0-3.798l6.532-3.214" />
      <path className="fill-[#AAB6F3] dark:fill-[#3449BA]" d="M34.54 18.86l6.373 3.183c1.566.782 1.566 3.016 0 3.8L26.098 33.24a4.623 4.623 0 01-4.125 0L7.174 25.843c-1.565-.781-1.565-3.016 0-3.798l6.33-3.164" />
      <path className="fill-[#CFD6F8] dark:fill-[#22307C]" d="M21.94 23.058L7.306 15.745c-1.62-.81-1.62-3.123 0-3.932l14.631-7.319a4.693 4.693 0 014.194 0l14.648 7.319c1.622.81 1.62 3.124 0 3.932L26.13 23.058c-1.321.66-2.873.66-4.191 0z" />
    </svg>;
  const GithubIcon = () => <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className="w-5 h-5">
      <path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"></path>
    </svg>;
  function IconTile({children}) {
    return <div className="
          shrink-0 grid place-items-center w-10 h-10 rounded-lg
          bg-indigo-50 ring-1 ring-indigo-200/60
          dark:bg-indigo-950/40 dark:ring-white/10
        ">
        {children}
      </div>;
  }
  function Card({className = "", children}) {
    return <div className={`rounded-2xl shadow-sm ring-1 ring-zinc-200 dark:ring-zinc-800 ${className}`}>{children}</div>;
  }
  function Button({variant = "primary", type = "button", onClick, children}) {
    const base = "inline-flex items-center justify-center gap-2 h-10 px-4 rounded-xl font-medium transition";
    let styles = "";
    if (variant === "primary") {
      styles = "mint-bg-indigo-600 text-white hover:mint-bg-indigo-700";
    } else if (variant === "outline") {
      styles = "border border-zinc-300 dark:border-zinc-700 mint-bg-transparent hover:mint-bg-zinc-50 dark:hover:mint-bg-zinc-800";
    } else if (variant === "ghost") {
      styles = "hover:mint-bg-zinc-100 dark:hover:mint-bg-zinc-800";
    }
    return <button type={type} onClick={onClick} className={`${base} ${styles}`}>
        {children}
      </button>;
  }
  function Input({id, label, value, onChange, placeholder, name}) {
    return <label className="block space-y-1">
        <span className="text-sm text-zinc-700 dark:text-zinc-300">{label}</span>
        <input id={id} name={name} className="w-full h-11 px-3 rounded-xl border border-zinc-300 dark:border-zinc-700 bg-white dark:bg-zinc-900 text-zinc-900 dark:text-zinc-100 focus:outline-none focus:ring-2 focus:ring-indigo-500" placeholder={placeholder} value={value} onChange={e => onChange(e.target.value)} />
      </label>;
  }
  function Select({label, value, onChange, options}) {
    return <label className="block space-y-1 max-w-[300px]">
        <span className="text-sm text-zinc-700 dark:text-zinc-300">{label}</span>
        <div className="relative">
          <select className="w-full h-11 appearance-none px-3 pr-9 rounded-xl border border-zinc-300 dark:border-zinc-700 bg-white dark:bg-zinc-900 text-zinc-900 dark:text-zinc-100 focus:outline-none focus:ring-2 focus:ring-indigo-500" value={value} onChange={e => onChange(e.target.value)}>
            <optgroup label="Generic Applications">
              {options.map(o => <option key={o.id} value={o.id}>
                  {o.name}
                </option>)}
            </optgroup>
          </select>
          <svg className="pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 w-5 h-5 text-zinc-500" viewBox="0 0 24 24">
            <path d="M7 10l5 5 5-5z" fill="currentColor" />
          </svg>
        </div>
      </label>;
  }
  function Toast({open, onClose, children}) {
    useEffect(() => {
      if (!open) return;
      const t = setTimeout(onClose, 2200);
      return () => clearTimeout(t);
    }, [open, onClose]);
    return <div className={`fixed right-4 top-4 z-50 transition ${open ? "opacity-100 translate-y-0" : "opacity-0 -translate-y-2 pointer-events-none"}`}>
        <div className="flex items-center gap-2 rounded-xl shadow ring-1 ring-emerald-200 bg-white dark:bg-zinc-900 px-4 py-2">
          <span className="w-1.5 h-8 rounded-l bg-emerald-500" />
          <svg className="w-5 h-5 text-emerald-600" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
            <path d="M20 6L9 17l-5-5" />
          </svg>
          <span className="text-sm text-zinc-900 dark:text-zinc-100">{children}</span>
        </div>
      </div>;
  }
  function Flows() {
    const [route, setRoute] = useState("menu");
    const [apps, setApps] = useState(loadApps());
    const [cfg, setCfg] = useState(loadCfg());
    const [selected, setSelected] = useState(apps[0]?.id || "");
    const [toast, setToast] = useState(false);
    const [bc] = useState(() => mkChannel());
    useEffect(() => {
      if (!apps.find(a => a.id === selected)) {
        setSelected(apps[0]?.id || "");
      }
    }, [apps, selected]);
    useEffect(() => {
      const onMsg = e => {
        const {type, payload} = e.data || ({});
        switch (type) {
          case "NAV":
            setRoute(payload.route);
            break;
          case "SELECT":
            setSelected(payload.appId);
            break;
          case "APPS_UPDATED":
            setApps(loadApps());
            break;
          case "CFG_UPDATED":
            setCfg(loadCfg());
            setToast(true);
            break;
          default:
            break;
        }
      };
      bc.addEventListener("message", onMsg);
      return () => bc.removeEventListener("message", onMsg);
    }, [bc]);
    const nav = nextRoute => {
      setRoute(nextRoute);
      bc.postMessage({
        type: "NAV",
        payload: {
          route: nextRoute
        }
      });
    };
    const selectApp = appId => {
      setSelected(appId);
      bc.postMessage({
        type: "SELECT",
        payload: {
          appId
        }
      });
    };
    const onCreate = name => {
      const id = uid();
      const next = [...apps, {
        id,
        name: name || "Untitled"
      }];
      setApps(next);
      saveApps(next);
      bc.postMessage({
        type: "APPS_UPDATED"
      });
      selectApp(id);
      nav("integrate");
    };
    const onSaveCfg = (appId, data) => {
      const next = {
        ...cfg,
        [appId]: data
      };
      setCfg(next);
      saveCfg(next);
      setToast(true);
      bc.postMessage({
        type: "CFG_UPDATED"
      });
    };
    return <div>
        {route === "menu" && <Menu onCreate={() => nav("create")} onIntegrate={() => nav("integrate")} />}

        {route === "create" && <CreateForm onCancel={() => nav("menu")} onSave={onCreate} />}

        {route === "integrate" && <IntegrateForm apps={apps} selected={selected} onSelect={selectApp} saved={cfg[selected]} onSave={data => onSaveCfg(selected, data)} onCancel={() => nav("menu")} />}

        <Toast open={toast} onClose={() => setToast(false)}>
          Successfully saved your changes.
        </Toast>
      </div>;
  }
  function Menu({onCreate, onIntegrate}) {
    return <ul className="space-y-4 list-none login_list">
        <li className="list-none !px-0">
          <button onClick={onCreate} className="w-full text-left">
            <Card className="p-5 hover:shadow-md transition">
              <div className="flex items-center justify-between">
                <div className="flex items-center gap-4">
                  <IconTile>
                    <LightningIcon />
                  </IconTile>
                  <h2 className="text-lg">Create a new application</h2>
                </div>
                <RightChevron className="w-4 h-4 text-zinc-500" />
              </div>
            </Card>
          </button>
        </li>
        <li className="list-none !px-0">
          <button onClick={onIntegrate} className="w-full text-left">
            <Card className="p-5 hover:shadow-md transition">
              <div className="flex items-center justify-between">
                <div className="flex items-center gap-4">
                  <IconTile>
                    <LayersIcon />
                  </IconTile>
                  <h2 className="text-lg">Integrate with an existing application</h2>
                </div>
                <RightChevron className="w-4 h-4 text-zinc-500" />
              </div>
            </Card>
          </button>
        </li>
        <li className="list-none !px-0">
          <a className="no_external_icon block" href={sampleApp ? sampleApp : "/"} target="_blank" rel="noreferrer">
            <Card className="p-5 hover:shadow-md transition">
              <div className="flex items-center justify-between">
                <div className="flex items-center gap-4">
                  <IconTile>
                    <GithubIcon />
                  </IconTile>
                  <h2 className="text-lg">View a sample application</h2>
                </div>
                <RightChevron className="w-4 h-4 text-zinc-500" />
              </div>
            </Card>
          </a>
        </li>
      </ul>;
  }
  function CreateForm({onSave, onCancel}) {
    const [name, setName] = useState("");
    return <div className="space-y-6">
        <Input id="app-name" label="Application Name" placeholder="My App" value={name} onChange={setName} />
        <p className="text-sm text-zinc-500">You can change this later in the application settings.</p>
        <div className="flex gap-3">
          <Button onClick={() => onSave(name)}>Save</Button>
          <Button variant="outline" onClick={onCancel}>
            Cancel
          </Button>
        </div>
      </div>;
  }
  function IntegrateForm({apps, selected, onSelect, saved, onSave, onCancel}) {
    const [callbacks, setCallbacks] = useState(saved?.callbacks ?? "");
    const [logouts, setLogouts] = useState(saved?.logouts ?? "");
    const [origins, setOrigins] = useState(saved?.origins ?? "");
    useEffect(() => {
      setCallbacks(loadCfg()[selected]?.callbacks ?? "");
      setLogouts(loadCfg()[selected]?.logouts ?? "");
      setOrigins(loadCfg()[selected]?.origins ?? "");
    }, [selected]);
    return <div className="space-y-6">
        <div>
          <span className="block text-sm text-zinc-600 dark:text-zinc-300 mb-1">Select your Application</span>
          <Select label="" value={selected} onChange={onSelect} options={apps} />
        </div>

        <form className="space-y-4" onSubmit={e => {
      e.preventDefault();
      onSave({
        callbacks,
        logouts,
        origins
      });
    }}>
          <Input id="callbacks" name="callbacks" label="Callback URLs" placeholder="http://localhost:3000" value={callbacks} onChange={setCallbacks} />
          <Input id="logout" name="allowed_logout_urls" label="Logout URLs" placeholder="http://localhost:3000" value={logouts} onChange={setLogouts} />
          <Input id="origins" name="web_origins" label="Allowed Web Origins" placeholder="http://localhost:3000" value={origins} onChange={setOrigins} />

          <div className="flex gap-3 pt-2">
            <Button type="submit">Save</Button>
            <Button variant="outline" type="button" onClick={onCancel}>
              Cancel
            </Button>
          </div>
        </form>
      </div>;
  }
  return <div className="w-full mx-auto py-8">
      <Flows />
    </div>;
};

export const SignUpForm = () => {
  return <div className="flex flex-col gap-2 items-center h-full">
      <img noZoom src="/docs/img/quickstarts/action_hero_dashboard.svg" alt="Sign up for an Auth0 account" style={{
    width: "250px",
    height: "250px"
  }} />
      <span className="text-center" style={{
    width: "400px"
  }}>
        Sign up for an{" "}
        <a href="https://auth0.com/signup" target="_blank" rel="noopener noreferrer">
          Auth0 account
        </a>{" "}
        or{" "}
        <span className="font-semibold text-primary cursor-pointer" onClick={() => console.log("log in")}>
          log in
        </span>{" "}
        to your existing account to integrate directly with your own tenant.
      </span>
      <button onClick={() => console.log("sign up")} className="bg-primary dark:bg-primary-light text-white dark:text-black px-4 py-2 rounded-md mt-4 font-medium" style={{
    width: "140px"
  }}>
        Sign up
      </button>
    </div>;
};

export const SideMenuSectionItem = ({id, children}) => {
  return <div id={`side-menu-item-${id}`} className="recipe-side-menu-item flex flex-col w-full h-full">
      {children}
    </div>;
};

export const SideMenu = ({sections, children}) => {
  const [visibleSection, setVisibleSection] = useState(sections[0]?.id ?? null);
  const checkVisibility = () => {
    let currentVisible = null;
    const viewportHeight = window.innerHeight;
    const scrollY = window.scrollY;
    sections.forEach(({id}) => {
      const section = document.getElementById(id);
      if (section) {
        const rect = section.getBoundingClientRect();
        const sectionTop = rect.top + scrollY;
        const sectionBottom = sectionTop + rect.height;
        const multiplier = viewportHeight > 1600 ? 0.34 : 0.22;
        if (scrollY + viewportHeight * multiplier >= sectionTop && scrollY <= sectionBottom) {
          currentVisible = id;
        }
      }
    });
    if (currentVisible && currentVisible !== visibleSection) {
      setVisibleSection(currentVisible);
    }
  };
  useEffect(() => {
    const throttledCheck = () => {
      setTimeout(checkVisibility, 100);
    };
    checkVisibility();
    window.addEventListener("scroll", throttledCheck);
    return () => {
      window.removeEventListener("scroll", throttledCheck);
    };
  }, [sections, visibleSection]);
  useEffect(() => {
    sections.forEach(({id}) => {
      const section = document.getElementById(id);
      const sideMenuItem = document.getElementById(`side-menu-item-${id}`);
      if (section) {
        if (id === visibleSection) {
          section.classList.add("active-section");
        } else {
          section.classList.remove("active-section");
        }
      }
      if (sideMenuItem) {
        if (id === visibleSection) {
          sideMenuItem.classList.add("active-side-menu-item");
        } else {
          sideMenuItem.classList.remove("active-side-menu-item");
        }
      }
    });
  }, [visibleSection, sections]);
  return <div className="recipe-side-menu sticky px-2 py-1" style={{
    height: "calc(100vh - 7rem)",
    top: "7rem",
    scrollMarginTop: "var(--scroll-mt)"
  }}>
      {children.map(child => {
    if (child.props.id === visibleSection) {
      return child;
    }
    return null;
  })}
    </div>;
};

export const Section = ({id, title, stepNumber, children, isSingleColumn = false}) => {
  return <div id={id} className={`recipe-section flex flex-col transition-opacity duration-200`}>
      {}
      <Step title={title} stepNumber={stepNumber} titleSize="h3">
        {children}
      </Step>
    </div>;
};

export const Content = ({title, children}) => {
  return <div className="recipe-content flex flex-col">
      {title && <h1 className="text-3xl">{title}</h1>}
      {children}
    </div>;
};

export const Recipe = ({children, isSingleColumn = false}) => {
  return <div className={`pl-4 recipe-container mx-auto grid grid-cols-1 gap-10 relative ${isSingleColumn ? "md:grid-cols-1" : "md:grid-cols-2"}`}>
      {children}
    </div>;
};

export const sections = [{
  id: "configure-auth0",
  title: "Configure Auth0"
}, {
  id: "install-dependencies",
  title: "Install dependencies"
}, {
  id: "integrate-auth0-in-your-application",
  title: "Integrate Auth0 in your application"
}, {
  id: "configure-the-auth0provider-component",
  title: "Configure the Auth0Provider component"
}, {
  id: "add-login-to-your-application",
  title: "Add login to your application"
}, {
  id: "add-logout-to-your-application",
  title: "Add logout to your application"
}, {
  id: "show-user-profile-information",
  title: "Show user profile information"
}];

<Recipe>
  <Content>
    This Quickstart is for the React Native framework. To integrate Auth0 into your Expo application, refer to the [Expo Quickstart](https://auth0.com/docs/quickstart/native/react-native-expo/interactive).

    <Section id={sections[0].id} title={sections[0].title} stepNumber="1">
      To use Auth0 services, you must have an application set up in the Auth0 Dashboard. The Auth0 application is where
      you will configure authentication in your project.

      ### Configure an application

      Use the interactive selector to create a new Auth0 application or select an existing application that represents
      the project you want to integrate with. Every application in Auth0 is assigned an alphanumeric, unique client ID
      that your application code will use to call Auth0 APIs through the SDK.

      Any settings you configure using this quickstart will automatically update for your Application in the [Dashboard](https://manage.auth0.com/#/), which is where you
      can manage your Applications in the future.

      To explore a complete configuration, review the sample application in your Dashboard.

      ### Configure callback and logout URLs

      Auth0 invokes the callback and logout URLs to redirect users back to your application. Auth0 invokes the callback
      URL after authenticating the user and the logout URL after removing the session cookie. If you do not set the
      callback and logout URLs, users will not be able to log in and out of the app, and your application will produce
      an error.

      Add the corresponding URL to **Callback URLs** and **Logout URLs**, according to your app's platform. If
      you are using a custom domain, use the value of your custom
      domain instead of your Auth0 tenant’s domain.

      #### iOS

      ```
      BUNDLE_IDENTIFIER.auth0://dev-gja8kxz4ndtex3rq.us.auth0.com/ios/BUNDLE_IDENTIFIER/callback
      ```

      #### Android

      ```
      PACKAGE_NAME.auth0://dev-gja8kxz4ndtex3rq.us.auth0.com/android/PACKAGE_NAME/callback
      ```

      <Info>
        If you are following along with our sample project, set the following for:

        * **iOS**:
          `com.auth0samples.auth0://labs-fundtraining.us.auth0.com/ios/com.auth0samples/callback`
        * **Android**:
          `com.auth0samples.auth0://labs-fundtraining.us.auth0.com/android/com.auth0samples/callback`
      </Info>
    </Section>

    <Section id={sections[1].id} title={sections[1].title} stepNumber="2">
      In this section, you will install the React Native Auth0 module.

      <Info>
        Refer to the [official documentation](https://facebook.github.io/react-native/) for additional details on React Native.
      </Info>

      ### Yarn

      ```
      yarn add react-native-auth0
      ```

      <Info>
        For further reference on yarn, check [their official documentation](https://yarnpkg.com/en/docs).
      </Info>

      ### npm

      ```
      npm install react-native-auth0 --save
      ```

      ### Additional iOS step: install the module Pod

      Our SDK requires a minimum iOS deployment target of 13.0. In your project's \`ios/Podfile\`\`, ensure your platform
      target is set to 13.0.

      ```
      platform :ios '13.0'
      ```

      CocoaPods is the iOS package management tool the React Native framework uses to install itself into your project.
      For the iOS native module to work with your iOS app, first install the library Pod. If you're familiar with older
      React Native SDK versions, this is similar to the previous Linking a Native module. The process is now simplified:

      Change directory into the `ios` folder and run `pod install`.

      ```
      cd ios
      pod install
      ```
    </Section>

    <Section id={sections[2].id} title={sections[2].title} stepNumber="3">
      First, you must provide a way for your users to log in. We recommend using the Auth0-hosted login page.

      <Frame>
        <img src="https://mintcdn.com/docs-staging-quickstart-revamp/TO6FS4AgTzQGgpsU/images/cdy7uua7fh8z/3ZRDXpjlUXEcQpXq6Q00L1/789d583affd1f09621dc59ae49b4060c/login-ios.png?fit=max&auto=format&n=TO6FS4AgTzQGgpsU&q=85&s=ec9baeebfca0cfc46808665037f4e883" width="750" height="1334" data-path="images/cdy7uua7fh8z/3ZRDXpjlUXEcQpXq6Q00L1/789d583affd1f09621dc59ae49b4060c/login-ios.png" />
      </Frame>

      ### Configure Android

      Open the `build.gradle` file in your application directory (typically at
      `android/app/build.gradle`) and add the following manifest placeholders. The value for
      `auth0Domain` should contain your Auth0 application settings as configured above.

      ```groovy lines
      android {
        defaultConfig {

            // Add the next line

            manifestPlaceholders = [auth0Domain: &quot;dev-gja8kxz4ndtex3rq.us.auth0.com&quot;, auth0Scheme: &quot;${applicationId}.auth0&quot;]

        }

        ...

      } 
      ```

      <Info>
        At runtime, the `applicationId` value will automatically update with your application's
        package name or ID (e.g. `com.example.app`). You can change this value from the
        `build.gradle` file. You can also check it at the top of your
        `AndroidManifest.xml` file.
      </Info>

      ### Configure iOS

      #### AppDelegate Setup (Choose Based on Architecture)

      If you're using (Swift - `ios/<YOUR PROJECT>/AppDelegat.swift`) add the following in
      `AppDelegate` class:

      ```text lines
      func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        return RCTLinkingManager.application(app, open: url, options: options)
      }
      ```

      If you're using (Objective-C++ - `ios/<YOUR PROJECT>/AppDelegate.mm`) add the following:

      ```text lines
      #import <React/RCTLinkingManager.h>


      (BOOL)application:(UIApplication *)app openURL:(NSURL *)url
            options:(NSDictionary&lt;UIApplicationOpenURLOptionsKey, id&gt; *)options



      {
      return [RCTLinkingManager application:app openURL:url options:options];
      }
      ```

      <Info>
        This file will be `ios/<YOUR PROJECT>/AppDelegate.m` on applications using the [old architecture](https://reactnative.dev/docs/next/new-architecture-app-intro#ios---use-objective-c-mm-extension).
      </Info>

      Next, add a URLScheme using your App's bundle identifier.

      In the `ios` folder, open the `Info.plist` and locate the value for
      `CFBundleIdentifier`.

      ```xml lines
      <key>CFBundleIdentifier</key>
      <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
      ```

      Below this value, register a URL type entry using the value of `CFBundleIdentifier` as the value for
      the `CFBundleURLSchemes`.

      ```xml lines
      <key>CFBundleURLTypes</key>
      <array>
      <dict>
      <key>CFBundleTypeRole</key>
      <string>None</string>
      <key>CFBundleURLName</key>
      <string>auth0</string>
      <key>CFBundleURLSchemes</key>
      <array>
      <string>$(PRODUCT_BUNDLE_IDENTIFIER).auth0</string>
      </array>
      </dict>
      </array>
      ```

      <Info>
        If your application was generated using the React Native CLI, the default value of
        `$(PRODUCT_BUNDLE_IDENTIFIER)` dynamically matches
        `org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)`. For the sample app, this
        value matches `com.auth0samples`.
      </Info>

      In a later step, you will use this value to define the callback URLs below. You can change it using XCode with
      the following steps:

      * Open the `ios/<YOUR PROJECT>.xcodeproj`file or run `xed ios`on a Terminal from
        the app root.
      * Open your project's or desired target's Build Settings tab and find the section that contains "Bundle
        Identifier".
      * Replace the "Bundle Identifier" value with your desired application's bundle identifier name.

      For additional information, please read [react native docs](https://facebook.github.io/react-native/docs/linking).
    </Section>

    <Section id={sections[3].id} title={sections[3].title} stepNumber="4">
      The `useAuth0` hook relies on a React Context to provide state management. The
      `Auth0Provider` component provides this context.

      Import the `useAuth0` hook and `Auth0Provider` component from the
      `react-native-auth0` package:

      ```jsx lines
      import {useAuth0, Auth0Provider} from 'react-native-auth0';
      ```

      For the SDK to function correctly, wrap your application in the `Auth0Provider` component and set the
      following properties:

      * `domain`: The domain of your Auth0 tenant. Generally, you can find this in the Auth0 Dashboard
        under your Application's Settings in the Domain field. If you are using a custom domain, you should set this to the value of your
        custom domain instead.
      * `clientId`: The ID of the Auth0 Application you set up earlier in this quickstart. You can find
        this in the Auth0 Dashboard under your application's Settings tab in the Client ID field.

      <Note>
        ##### Checkpoint

        You just configured the `Auth0Provider` component. Run your application to verify that:

        * The SDK is initializing correctly.
        * Your application is not throwing any errors related to Auth0.
      </Note>
    </Section>

    <Section id={sections[4].id} title={sections[4].title} stepNumber="5">
      Authenticate the user by calling the `authorize` method provided by the `useAuth0` hook.
      This method redirects the user to the Auth0 Universal
      Login page for authentication, then back to your app.

      To confirm the user successfully logged in, check that the `user` property provided by the hook is not
      `null`.

      <Note>
        ##### Checkpoint

        Add a button component that calls `authorize` when clicked. Verify that you are redirected to
        the login page and then back to your application.
      </Note>
    </Section>

    <Section id={sections[5].id} title={sections[5].title} stepNumber="6">
      To log the user out, redirect them to the Auth0 logout endpoint by calling `clearSession`. This will
      remove their session from the authorization server and log the user out of the application.

      <Note>
        ##### Checkpoint

        Add a button that calls `clearSession` and observe that you are redirected to the Auth0 logout
        endpoint and back again. You should no longer be logged in to your application.
      </Note>
    </Section>

    <Section id={sections[6].id} title={sections[6].title} stepNumber="7">
      The `useAuth0` hook exposes a `user` object that contains information about the
      authenticated user. You can use this to access decoded user profile information about the authenticated user from
      the ID token.

      If a user has not been authenticated, this property will be `null`.

      <Note>
        ##### Checkpoint

        Log in and inspect the `user` property on the result. Verify the current user's profile
        information, such as `email` or `name`.
      </Note>
    </Section>

    ## Next Steps

    Excellent work! If you made it this far, you should now have login, logout, and user profile information running in your application.

    This concludes our quickstart tutorial, but there is so much more to explore. To learn more about what you can do with Auth0, check out:

    * [Auth0 Dashboard](https://manage.auth0.com/dashboard/us/dev-gja8kxz4ndtex3rq) - Learn how to configure and manage your Auth0 tenant and applications
    * [react-native-auth0 SDK](https://github.com/auth0/react-native-auth0) - Explore the SDK used in this tutorial more fully
    * [Auth0 Marketplace](https://marketplace.auth0.com/) - Discover integrations you can enable to extend Auth0’s functionality
  </Content>

  <SideMenu sections={sections}>
    <SideMenuSectionItem id={sections[0].id}>
      <SignUpForm />
    </SideMenuSectionItem>

    <SideMenuSectionItem id={sections[1].id}>
      <SignUpForm />
    </SideMenuSectionItem>

    <SideMenuSectionItem id={sections[2].id}>
      <SignUpForm />
    </SideMenuSectionItem>

    <SideMenuSectionItem id={sections[3].id}>
      ```jsx app.js lines highlight={46-48}
      import React from 'react';
      import {Button, Text, View, StyleSheet} from 'react-native';
      import {useAuth0, Auth0Provider} from 'react-native-auth0';

      const Home = () => {
        const {authorize, clearSession, user, error, isLoading} = useAuth0();

        const onLogin = async () => {
          try {
            await authorize();
          } catch (e) {
            console.log(e);
          }
        };

        const onLogout = async () => {
          try {
            await clearSession();
          } catch (e) {
            console.log('Log out cancelled');
          }
        };

        if (isLoading) {
          return <View style={styles.container}><Text>Loading</Text></View>;
        }

        const loggedIn = user !== undefined && user !== null;

        return (
          <View style={styles.container}>
            {loggedIn && <Text>You are logged in as {user.name}</Text>}
            {!loggedIn && <Text>You are not logged in</Text>}
            {error && <Text>{error.message}</Text>}

            <Button
              onPress={loggedIn ? onLogout : onLogin}
              title={loggedIn ? 'Log Out' : 'Log In'}
            />
          </View>
        );
      };

      const App = () => {
        return (
          <Auth0Provider domain={"dev-gja8kxz4ndtex3rq.us.auth0.com"} clientId={"mz9iNEIo2PHu7oeh8QRt19ndTyyCIgai"}>
            <Home />
          </Auth0Provider>
        );
      };

      const styles = StyleSheet.create({
        container: {
          flex: 1,
          justifyContent: 'center',
          alignItems: 'center',
          backgroundColor: '#F5FCFF',
        }
      });

      export default App;
      ```
    </SideMenuSectionItem>

    <SideMenuSectionItem id={sections[4].id}>
      ```jsx app.js lines highlight={8-14}
      import React from 'react';
      import {Button, Text, View, StyleSheet} from 'react-native';
      import {useAuth0, Auth0Provider} from 'react-native-auth0';

      const Home = () => {
        const {authorize, clearSession, user, error, isLoading} = useAuth0();

        const onLogin = async () => {
          try {
            await authorize();
          } catch (e) {
            console.log(e);
          }
        };

        const onLogout = async () => {
          try {
            await clearSession();
          } catch (e) {
            console.log('Log out cancelled');
          }
        };

        if (isLoading) {
          return <View style={styles.container}><Text>Loading</Text></View>;
        }

        const loggedIn = user !== undefined && user !== null;

        return (
          <View style={styles.container}>
            {loggedIn && <Text>You are logged in as {user.name}</Text>}
            {!loggedIn && <Text>You are not logged in</Text>}
            {error && <Text>{error.message}</Text>}

            <Button
              onPress={loggedIn ? onLogout : onLogin}
              title={loggedIn ? 'Log Out' : 'Log In'}
            />
          </View>
        );
      };

      const App = () => {
        return (
          <Auth0Provider domain={"dev-gja8kxz4ndtex3rq.us.auth0.com"} clientId={"mz9iNEIo2PHu7oeh8QRt19ndTyyCIgai"}>
            <Home />
          </Auth0Provider>
        );
      };

      const styles = StyleSheet.create({
        container: {
          flex: 1,
          justifyContent: 'center',
          alignItems: 'center',
          backgroundColor: '#F5FCFF',
        }
      });

      export default App;
      ```
    </SideMenuSectionItem>

    <SideMenuSectionItem id={sections[5].id}>
      ```jsx app.js lines highlight={16-22}
      import React from 'react';
      import {Button, Text, View, StyleSheet} from 'react-native';
      import {useAuth0, Auth0Provider} from 'react-native-auth0';

      const Home = () => {
        const {authorize, clearSession, user, error, isLoading} = useAuth0();

        const onLogin = async () => {
          try {
            await authorize();
          } catch (e) {
            console.log(e);
          }
        };

        const onLogout = async () => {
          try {
            await clearSession();
          } catch (e) {
            console.log('Log out cancelled');
          }
        };

        if (isLoading) {
          return <View style={styles.container}><Text>Loading</Text></View>;
        }

        const loggedIn = user !== undefined && user !== null;

        return (
          <View style={styles.container}>
            {loggedIn && <Text>You are logged in as {user.name}</Text>}
            {!loggedIn && <Text>You are not logged in</Text>}
            {error && <Text>{error.message}</Text>}

            <Button
              onPress={loggedIn ? onLogout : onLogin}
              title={loggedIn ? 'Log Out' : 'Log In'}
            />
          </View>
        );
      };

      const App = () => {
        return (
          <Auth0Provider domain={"dev-gja8kxz4ndtex3rq.us.auth0.com"} clientId={"mz9iNEIo2PHu7oeh8QRt19ndTyyCIgai"}>
            <Home />
          </Auth0Provider>
        );
      };

      const styles = StyleSheet.create({
        container: {
          flex: 1,
          justifyContent: 'center',
          alignItems: 'center',
          backgroundColor: '#F5FCFF',
        }
      });

      export default App;
      ```
    </SideMenuSectionItem>

    <SideMenuSectionItem id={sections[6].id}>
      ```jsx app.js lines highlight={28-34}
      import React from 'react';
      import {Button, Text, View, StyleSheet} from 'react-native';
      import {useAuth0, Auth0Provider} from 'react-native-auth0';

      const Home = () => {
        const {authorize, clearSession, user, error, isLoading} = useAuth0();

        const onLogin = async () => {
          try {
            await authorize();
          } catch (e) {
            console.log(e);
          }
        };

        const onLogout = async () => {
          try {
            await clearSession();
          } catch (e) {
            console.log('Log out cancelled');
          }
        };

        if (isLoading) {
          return <View style={styles.container}><Text>Loading</Text></View>;
        }

        const loggedIn = user !== undefined && user !== null;

        return (
          <View style={styles.container}>
            {loggedIn && <Text>You are logged in as {user.name}</Text>}
            {!loggedIn && <Text>You are not logged in</Text>}
            {error && <Text>{error.message}</Text>}

            <Button
              onPress={loggedIn ? onLogout : onLogin}
              title={loggedIn ? 'Log Out' : 'Log In'}
            />
          </View>
        );
      };

      const App = () => {
        return (
          <Auth0Provider domain={"dev-gja8kxz4ndtex3rq.us.auth0.com"} clientId={"mz9iNEIo2PHu7oeh8QRt19ndTyyCIgai"}>
            <Home />
          </Auth0Provider>
        );
      };

      const styles = StyleSheet.create({
        container: {
          flex: 1,
          justifyContent: 'center',
          alignItems: 'center',
          backgroundColor: '#F5FCFF',
        }
      });

      export default App;
      ```
    </SideMenuSectionItem>
  </SideMenu>
</Recipe>
