File size: 4,711 Bytes
8059bf0 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | import { ref } from 'vue'
import { useAppStore } from '@/stores/app'
import { adminAPI } from '@/api/admin'
export type AddMethod = 'oauth' | 'setup-token'
export type AuthInputMethod = 'manual' | 'cookie' | 'refresh_token' | 'session_token' | 'access_token'
export interface OAuthState {
authUrl: string
authCode: string
sessionId: string
sessionKey: string
loading: boolean
error: string
}
export interface TokenInfo {
org_uuid?: string
account_uuid?: string
email_address?: string
[key: string]: unknown
}
export function useAccountOAuth() {
const appStore = useAppStore()
// State
const authUrl = ref('')
const authCode = ref('')
const sessionId = ref('')
const sessionKey = ref('')
const loading = ref(false)
const error = ref('')
// Reset state
const resetState = () => {
authUrl.value = ''
authCode.value = ''
sessionId.value = ''
sessionKey.value = ''
loading.value = false
error.value = ''
}
// Generate auth URL
const generateAuthUrl = async (
addMethod: AddMethod,
proxyId?: number | null
): Promise<boolean> => {
loading.value = true
authUrl.value = ''
sessionId.value = ''
error.value = ''
try {
const proxyConfig = proxyId ? { proxy_id: proxyId } : {}
const endpoint =
addMethod === 'oauth'
? '/admin/accounts/generate-auth-url'
: '/admin/accounts/generate-setup-token-url'
const response = await adminAPI.accounts.generateAuthUrl(endpoint, proxyConfig)
authUrl.value = response.auth_url
sessionId.value = response.session_id
return true
} catch (err: any) {
error.value = err.response?.data?.detail || 'Failed to generate auth URL'
appStore.showError(error.value)
return false
} finally {
loading.value = false
}
}
// Exchange auth code for tokens
const exchangeAuthCode = async (
addMethod: AddMethod,
proxyId?: number | null
): Promise<TokenInfo | null> => {
if (!authCode.value.trim() || !sessionId.value) {
error.value = 'Missing auth code or session ID'
return null
}
loading.value = true
error.value = ''
try {
const proxyConfig = proxyId ? { proxy_id: proxyId } : {}
const endpoint =
addMethod === 'oauth'
? '/admin/accounts/exchange-code'
: '/admin/accounts/exchange-setup-token-code'
const tokenInfo = await adminAPI.accounts.exchangeCode(endpoint, {
session_id: sessionId.value,
code: authCode.value.trim(),
...proxyConfig
})
return tokenInfo as TokenInfo
} catch (err: any) {
error.value = err.response?.data?.detail || 'Failed to exchange auth code'
appStore.showError(error.value)
return null
} finally {
loading.value = false
}
}
// Cookie-based authentication
const cookieAuth = async (
addMethod: AddMethod,
sessionKeyValue: string,
proxyId?: number | null
): Promise<TokenInfo | null> => {
if (!sessionKeyValue.trim()) {
error.value = 'Please enter sessionKey'
return null
}
loading.value = true
error.value = ''
try {
const proxyConfig = proxyId ? { proxy_id: proxyId } : {}
const endpoint =
addMethod === 'oauth'
? '/admin/accounts/cookie-auth'
: '/admin/accounts/setup-token-cookie-auth'
const tokenInfo = await adminAPI.accounts.exchangeCode(endpoint, {
session_id: '',
code: sessionKeyValue.trim(),
...proxyConfig
})
return tokenInfo as TokenInfo
} catch (err: any) {
error.value = err.response?.data?.detail || 'Cookie authorization failed'
return null
} finally {
loading.value = false
}
}
// Parse multiple session keys
const parseSessionKeys = (input: string): string[] => {
return input
.split('\n')
.map((k) => k.trim())
.filter((k) => k)
}
// Build extra info from token response
const buildExtraInfo = (tokenInfo: TokenInfo): Record<string, string> | undefined => {
const extra: Record<string, string> = {}
if (tokenInfo.org_uuid) {
extra.org_uuid = tokenInfo.org_uuid
}
if (tokenInfo.account_uuid) {
extra.account_uuid = tokenInfo.account_uuid
}
if (tokenInfo.email_address) {
extra.email_address = tokenInfo.email_address
}
return Object.keys(extra).length > 0 ? extra : undefined
}
return {
// State
authUrl,
authCode,
sessionId,
sessionKey,
loading,
error,
// Methods
resetState,
generateAuthUrl,
exchangeAuthCode,
cookieAuth,
parseSessionKeys,
buildExtraInfo
}
}
|