useOAuth
Kick off OAuth authentication or linking flows for providers such as Google, Apple, Discord, and more.
Request
type Request = {
hook: 'useOAuth',
params: [options?: AuthHookOptions]
}
type AuthHookOptions = {
redirectTo?: string
logoutOnError?: boolean
recoverWalletAutomatically?: boolean
onSuccess?: (data: StoreCredentialsResult | InitOAuthReturnType) => void
onError?: (error: OpenfortError) => void
onSettled?: (data: StoreCredentialsResult | InitOAuthReturnType | undefined | null, error: OpenfortError | null) => void
throwOnError?: boolean
}
type OpenfortError = {
message: string
type: OpenfortErrorType
data: { [key: string]: any }
name: string
}
enum OpenfortErrorType {
AUTHENTICATION_ERROR = "AUTHENTICATION_ERROR",
WALLET_ERROR = "WALLET_ERROR",
CONFIGURATION_ERROR = "CONFIGURATION_ERROR",
VALIDATION_ERROR = "VALIDATION_ERROR",
}Response
type Response = UseOAuthReturn
type UseOAuthReturn = OAuthStatusFlags & {
initOAuth(options: InitializeOAuthOptions): Promise<InitOAuthReturnType>
linkOauth(options: InitializeOAuthOptions): Promise<InitOAuthReturnType>
storeCredentials(options: StoreCredentialsOptions): Promise<StoreCredentialsResult>
}
type OAuthStatusFlags = {
isLoading: boolean
isError: boolean
isSuccess: boolean
error?: OpenfortError | null
}
type InitOAuthReturnType = {
error?: OpenfortError
}
type StoreCredentialsResult = {
user?: AuthPlayerResponse
wallet?: UserWallet
error?: OpenfortError
}
type InitializeOAuthOptions = {
provider: OAuthProvider
redirectTo?: string
onSuccess?: (data: InitOAuthReturnType) => void
onError?: (error: OpenfortError) => void
onSettled?: (data: InitOAuthReturnType | undefined | null, error: OpenfortError | null) => void
throwOnError?: boolean
}
type StoreCredentialsOptions = {
player: string
accessToken: string
refreshToken: string
onSuccess?: (data: StoreCredentialsResult) => void
onError?: (error: OpenfortError) => void
onSettled?: (data: StoreCredentialsResult | undefined | null, error: OpenfortError | null) => void
throwOnError?: boolean
logoutOnError?: boolean
recoverWalletAutomatically?: boolean
}
enum OAuthProvider {
GOOGLE = "GOOGLE",
FACEBOOK = "FACEBOOK",
DISCORD = "DISCORD",
TWITTER = "TWITTER",
EPIC_GAMES = "EPIC_GAMES",
APPLE = "APPLE",
CUSTOM = "CUSTOM",
}
type UserWallet = {
address: `0x${string}`
connectorType?: string
walletClientType?: string
id: string
isAvailable: boolean
isActive?: boolean
isConnecting?: boolean
recoveryMethod?: RecoveryMethod
accountId?: string
accountType?: AccountTypeEnum
ownerAddress?: `0x${string}`
implementationType?: string
createdAt?: number
salt?: string
}
type AuthPlayerResponse = {
player?: {
id: string
object: 'player'
name: string
description?: string
createdAt: number
metadata?: { [key: string]: any }
transactionIntents?: any[]
accounts?: any[]
}
id: string
object: 'player'
createdAt: number
linkedAccounts: LinkedAccount[]
}
type LinkedAccount = {
provider: string
email?: string
address?: string
externalUserId?: string
verified?: boolean
disabled: boolean
walletClientType?: string
connectorType?: string
updatedAt?: number
metadata?: { [key: string]: any }
}
enum RecoveryMethod {
AUTOMATIC = "automatic",
PASSWORD = "password",
PASSKEY = "passkey",
}
enum AccountTypeEnum {
SMART_ACCOUNT = "Smart Account",
EOA = "Externally Owned Account",
}Example
import { OAuthProvider, useOAuth } from "@openfort/react"
function SocialLogin() {
const { initOAuth, linkOauth, storeCredentials, isLoading, isError, isSuccess, error } = useOAuth({
redirectTo: "https://app.example.com/auth/callback",
throwOnError: true,
onSuccess: () => {},
onError: () => {},
onSettled: () => {},
})
const loginWithGoogle = () => initOAuth({ provider: OAuthProvider.GOOGLE })
const linkDiscord = () => linkOauth({ provider: OAuthProvider.DISCORD })
return null
}