fix anthropic console auth (#2049)

This commit is contained in:
Dax 2025-08-18 17:12:21 -04:00 committed by GitHub
parent 5d12cadba7
commit f19586cebd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 121 additions and 24 deletions

View file

@ -15,6 +15,7 @@
"name": "@opencode/cloud-app",
"dependencies": {
"@ibm/plex": "6.4.1",
"@openauthjs/openauth": "0.0.0-20250322224806",
"@solidjs/meta": "^0.29.4",
"@solidjs/router": "^0.15.0",
"@solidjs/start": "^1.1.0",

View file

@ -9,6 +9,7 @@
},
"dependencies": {
"@ibm/plex": "6.4.1",
"@openauthjs/openauth": "0.0.0-20250322224806",
"@solidjs/meta": "^0.29.4",
"@solidjs/router": "^0.15.0",
"@solidjs/start": "^1.1.0",

View file

@ -0,0 +1,28 @@
import { useSession } from "vinxi/http"
import { createClient } from "@openauthjs/openauth/client"
export const AuthClient = createClient({
clientID: "app",
issuer: "https://auth.dev.opencode.ai",
})
export interface AuthSession {
account: Record<string, {
id: string
email: string
}>
current?: string
}
export function useAuthSession() {
"use server"
return useSession<AuthSession>({
password: "0".repeat(32),
name: "auth"
})
}
export function AuthProvider() {
}

View file

@ -0,0 +1,7 @@
import type { APIEvent } from "@solidjs/start/server"
import { AuthClient } from "~/context/auth"
export async function GET(input: APIEvent) {
const result = await AuthClient.authorize(new URL("./callback", input.request.url).toString(), "code")
return Response.redirect(result.url, 302)
}

View file

@ -0,0 +1,36 @@
import type { APIEvent } from "@solidjs/start/server"
import { AuthClient, useAuthSession } from "~/context/auth"
export async function GET(input: APIEvent) {
const url = new URL(input.request.url)
const code = url.searchParams.get("code")
if (!code) throw new Error("No code found")
const redirectURI = `${url.origin}${url.pathname}`
console.log({
redirectURI,
code,
})
const result = await AuthClient.exchange(code, `${url.origin}${url.pathname}`)
if (result.err) {
throw new Error(result.err.message)
}
const decoded = AuthClient.decode(result.tokens.access, {} as any)
if (decoded.err) throw new Error(decoded.err.message)
const session = await useAuthSession()
const id = decoded.subject.properties.accountID
await session.update((value) => {
return {
...value,
account: {
[id]: {
id,
email: decoded.subject.properties.email,
},
},
current: id,
}
})
return {
result,
}
}

View file

@ -51,7 +51,7 @@ export default function Home() {
<a href="/docs">Get Started</a>
</div>
<div data-slot="right">
<button data-copy data-slot="command" data-command="curl -fsSL https://opencode.ai/install | bash">
<button data-copy data-slot="command">
<span>
<span>curl -fsSL&nbsp;</span>
<span data-slot="protocol">https://</span>

View file

@ -176,12 +176,20 @@ export const AuthLoginCommand = cmd({
spinner.stop("Failed to authorize", 1)
}
if (result.type === "success") {
if ("refresh" in result) {
await Auth.set(provider, {
type: "oauth",
refresh: result.refresh,
access: result.access,
expires: result.expires,
})
}
if ("key" in result) {
await Auth.set(provider, {
type: "api",
key: result.key,
})
}
spinner.stop("Login successful")
}
}
@ -197,12 +205,20 @@ export const AuthLoginCommand = cmd({
prompts.log.error("Failed to authorize")
}
if (result.type === "success") {
if ("refresh" in result) {
await Auth.set(provider, {
type: "oauth",
refresh: result.refresh,
access: result.access,
expires: result.expires,
})
}
if ("key" in result) {
await Auth.set(provider, {
type: "api",
key: result.key,
})
}
prompts.log.success("Login successful")
}
}

View file

@ -26,7 +26,7 @@ export namespace Plugin {
const plugins = [...(config.plugin ?? [])]
if (!Flag.OPENCODE_DISABLE_DEFAULT_PLUGINS) {
plugins.push("opencode-copilot-auth")
plugins.push("opencode-anthropic-auth")
plugins.push("opencode-anthropic-auth@0.0.2")
}
for (let plugin of plugins) {
log.info("loading plugin", { path: plugin })

View file

@ -32,12 +32,16 @@ export interface Hooks {
| {
method: "auto"
callback(): Promise<
| {
| ({
type: "success"
} & (
| {
refresh: string
access: string
expires: number
}
| { key: string }
))
| {
type: "failed"
}
@ -46,12 +50,16 @@ export interface Hooks {
| {
method: "code"
callback(code: string): Promise<
| {
| ({
type: "success"
} & (
| {
refresh: string
access: string
expires: number
}
| { key: string }
))
| {
type: "failed"
}