add an auth callback for web

This commit is contained in:
Hailey
2025-07-18 00:24:43 -07:00
parent 66ec6e9a8d
commit 796d989781
8 changed files with 44 additions and 4 deletions
+3
View File
@@ -331,6 +331,9 @@ func serve(cctx *cli.Context) error {
e.GET("/starter-pack-short/:code", server.WebGeneric) e.GET("/starter-pack-short/:code", server.WebGeneric)
e.GET("/start/:handleOrDID/:rkey", server.WebStarterPack) e.GET("/start/:handleOrDID/:rkey", server.WebStarterPack)
// auth callback
e.GET("/auth/web/callback", server.WebGeneric)
// ipcc // ipcc
e.GET("/ipcc", server.WebIpCC) e.GET("/ipcc", server.WebIpCC)
+1 -1
View File
@@ -3,7 +3,7 @@
"client_name": "Bluesky (Hailey Demo)", "client_name": "Bluesky (Hailey Demo)",
"client_uri": "https://bsky.hailey.at", "client_uri": "https://bsky.hailey.at",
"redirect_uris": [ "redirect_uris": [
"https://bsky.hailey.at/auth/callback" "https://bsky.hailey.at/auth/web/callback"
], ],
"scope": "atproto transition:generic", "scope": "atproto transition:generic",
"token_endpoint_auth_method": "none", "token_endpoint_auth_method": "none",
@@ -3,7 +3,7 @@
"client_name": "Bluesky Native App (Hailey Demo)", "client_name": "Bluesky Native App (Hailey Demo)",
"client_uri": "https://bsky.hailey.at", "client_uri": "https://bsky.hailey.at",
"redirect_uris": [ "redirect_uris": [
"at.hailey.bsky:/auth/callback" "at.hailey.bsky:/auth/native/callback"
], ],
"scope": "atproto transition:generic", "scope": "atproto transition:generic",
"token_endpoint_auth_method": "none", "token_endpoint_auth_method": "none",
+8
View File
@@ -135,6 +135,7 @@ import {router} from '#/routes'
import {Referrer} from '../modules/expo-bluesky-swiss-army' import {Referrer} from '../modules/expo-bluesky-swiss-army'
import {useAccountSwitcher} from './lib/hooks/useAccountSwitcher' import {useAccountSwitcher} from './lib/hooks/useAccountSwitcher'
import {useNonReactiveCallback} from './lib/hooks/useNonReactiveCallback' import {useNonReactiveCallback} from './lib/hooks/useNonReactiveCallback'
import {AuthCallback} from './screens/Login/AuthCallback'
import {useLoggedOutViewControls} from './state/shell/logged-out' import {useLoggedOutViewControls} from './state/shell/logged-out'
import {useCloseAllActiveElements} from './state/util' import {useCloseAllActiveElements} from './state/util'
@@ -600,6 +601,13 @@ function commonScreens(Stack: typeof Flat, unreadCountLabel?: string) {
requireAuth: true, requireAuth: true,
}} }}
/> />
<Stack.Screen
name="AuthCallback"
getComponent={() => AuthCallback}
options={{
title: title(msg`Authenticating...`),
}}
/>
</> </>
) )
} }
+1
View File
@@ -82,6 +82,7 @@ export type CommonNavigatorParams = {
StarterPackWizard: undefined StarterPackWizard: undefined
StarterPackEdit: {rkey?: string} StarterPackEdit: {rkey?: string}
VideoFeed: VideoFeedSourceContext VideoFeed: VideoFeedSourceContext
AuthCallback: undefined
} }
export type BottomTabNavigatorParams = CommonNavigatorParams & { export type BottomTabNavigatorParams = CommonNavigatorParams & {
+1
View File
@@ -90,4 +90,5 @@ export const router = new Router<AllNavigatableRoutes>({
StarterPackShort: '/starter-pack-short/:code', StarterPackShort: '/starter-pack-short/:code',
StarterPackWizard: '/starter-pack/create', StarterPackWizard: '/starter-pack/create',
VideoFeed: '/video-feed', VideoFeed: '/video-feed',
AuthCallback: '/auth/web/callback',
}) })
+27
View File
@@ -0,0 +1,27 @@
import {useEffect} from 'react'
import {useNavigation} from '@react-navigation/native'
import {type NavigationProp} from '#/lib/routes/types'
import {useSessionApi} from '#/state/session'
import {getWebOAuthClient} from '#/state/session/oauth'
export function AuthCallback() {
const {loginOauth} = useSessionApi()
const navigation = useNavigation<NavigationProp>()
// TODO: handle errors, loading state, etc...
useEffect(() => {
const urlStr = window.location.href
const url = new URL(urlStr)
const params = new URLSearchParams(url.hash.substring(1))
;(async () => {
const client = getWebOAuthClient()
const res = await client.callback(params)
await loginOauth(res.session, 'LoginForm') // TODO: right context?
navigation.navigate('Home')
})()
}, [loginOauth, navigation])
return null
}
+2 -2
View File
@@ -12,7 +12,7 @@ export function createWebOAuthClient() {
client_id: 'https://bsky.hailey.at/oauth-client-metadata.json', client_id: 'https://bsky.hailey.at/oauth-client-metadata.json',
client_name: 'Bluesky (Hailey Demo)', client_name: 'Bluesky (Hailey Demo)',
client_uri: 'https://bsky.hailey.at', client_uri: 'https://bsky.hailey.at',
redirect_uris: ['https://bsky.hailey.at/auth/callback'], redirect_uris: ['https://bsky.hailey.at/auth/web/callback'],
scope: 'atproto transition:generic', scope: 'atproto transition:generic',
token_endpoint_auth_method: 'none', token_endpoint_auth_method: 'none',
response_types: ['code'], response_types: ['code'],
@@ -30,7 +30,7 @@ export function createNativeOAuthClient() {
client_id: 'https://bsky.hailey.at/oauth-client-metadata.native.json', client_id: 'https://bsky.hailey.at/oauth-client-metadata.native.json',
client_name: 'Bluesky Native App (Hailey Demo)', client_name: 'Bluesky Native App (Hailey Demo)',
client_uri: 'https://bsky.hailey.at', client_uri: 'https://bsky.hailey.at',
redirect_uris: ['at.hailey.bsky:/auth/callback'], redirect_uris: ['at.hailey.bsky:/auth/native/callback'],
scope: 'atproto transition:generic', scope: 'atproto transition:generic',
token_endpoint_auth_method: 'none', token_endpoint_auth_method: 'none',
response_types: ['code'], response_types: ['code'],