+137
-16
README.md
+137
-16
README.md
···+This is an Expo client library for Atproto OAuth. It implements the required native crypto functions for supporting JWTs in React Native and uses+the base `OAuthClient` interface found in [the Atproto repository](https://github.com/bluesky-social/atproto/tree/main/packages/oauth/oauth-client).+Before using this library, there are a few additional libraries that you must install within your Expo application.+- [abortcontroller-polyfill](https://www.npmjs.com/package/abortcontroller-polyfill) (or similar)+Apply the two polyfills inside your application's entrypoint (usually `index.ts`). They should be placed _before_ anything else in the file, and particularly before `registerRootComponent(App)`.+> As of current (Expo 53), you _must_ apply an Expo patch for this library to work. You may use the patch found [here](https://github.com/haileyok/expo-atproto-auth/blob/main/patches/expo%2B53.0.19.patch).+A fix for this has been submitted up stream and merged, so will hopefully be fixed in Expo 54 (see the PR [here](https://github.com/expo/expo/pull/38122)).+For bare React Native projects, you must ensure that you have [installed and configured the `expo` package](https://docs.expo.dev/bare/installing-expo-modules/)+Once you have satisfied the prerequisites, you can simply install the library with `yarn add expo-atproto-auth`.+You will need to server an `oauth-client-metadata.json` from your application's website. An example of this metadata+- The `client_id` should be the same URL as where you are serving your `oauth-client-metadata.json` from+- Your `redirect_uris` should contain the native redirect URI in the first position. Additionally, the scheme must be+formatted as the _reverse_ of the domain you are serving the metadata from. Since I am serving mine from `hailey.at`,+I use `at.hailey` as the scheme. If my domain were `atproto.expo.dev`, I would use `dev.expo.atproto`. Additionally, the scheme _must_ contain _only one trailing slash_ after the `:`. `at.hailey://` would be invalid.+For a real-world example, see [Skylight's client metadata](https://skylight.expo.app/oauth/client-metadata.json).+For more information about client metadata, see [the Atproto documentation](https://atproto.com/specs/oauth#client-id-metadata-document).+Next, you want to create an `ExpoOAuthClient`. You will need to pass in the same client metadata to the client as you are serving in your `oauth-client-metadata.json`.-- [Documentation for the latest stable release](https://docs.expo.dev/versions/latest/sdk/atproto-auth/)-- [Documentation for the main branch](https://docs.expo.dev/versions/unversioned/sdk/atproto-auth/)-For [managed](https://docs.expo.dev/archive/managed-vs-bare/) Expo projects, please follow the installation instructions in the [API documentation for the latest stable release](#api-documentation). If you follow the link and there is no documentation available then this library is not yet usable within managed projects — it is likely to be included in an upcoming Expo SDK release.+Whenever you are ready, you can initiate a sign in attempt for the user using the client using `client.signIn(input)`-For bare React Native projects, you must ensure that you have [installed and configured the `expo` package](https://docs.expo.dev/bare/installing-expo-modules/) before continuing.+> If you wish to allow a user to _create_ an account instead of signing in, simply use a valid PDS hostname rather than+> a handle. They will be presented the option to either Sign In with an existing account, or create a new one.+To interface with the various Atproto APIs, you will need to create an `Agent`. You will pass your `OAuthSession` to the `Agent`.+After, for example, closing the application, you will probably need to restore the user's session. You can do this by using the user's DID on the `ExpoOAuthClient`.+If the session needs to be refreshed, `.restore()` will do this for you before returning a session.-Contributions are very welcome! Please refer to guidelines described in the [contributing guide]( https://github.com/expo/expo#contributing).+- [Atproto Web OAuth Example](https://github.com/bluesky-social/atproto/tree/main/packages/oauth/oauth-client-browser-example)
+5
-7
example/App.tsx
+5
-7
example/App.tsx
·········
+3
-3
src/index.ts
+3
-3
src/index.ts
+4
-4
src/react-native-key.ts
src/expo-key.ts
+4
-4
src/react-native-key.ts
src/expo-key.ts
·········
+6
-6
src/react-native-oauth-client.ts
src/expo-oauth-client.ts
+6
-6
src/react-native-oauth-client.ts
src/expo-oauth-client.ts
·········options.clientMetadata ?? atprotoLoopbackClientMetadata('localhost'), // HACK: this fixes a type error for now, look into it later
+6
-9
src/react-native-oauth-database.ts
src/expo-oauth-database.ts
+6
-9
src/react-native-oauth-database.ts
src/expo-oauth-database.ts
···············
+2
-2
src/react-native-runtime-implementation.ts
src/expo-runtime-implementation.ts
+2
-2
src/react-native-runtime-implementation.ts
src/expo-runtime-implementation.ts
···