콘텐츠로 건너뛰기

@xid-kit/tauri

PKCE S256 흐름, 딥링크 콜백 핸들러, OS keychain 어댑터, Rust 플러그인 템플릿이 있는 Tauri v2 데스크톱 SDK.

Markdown으로 보기

상태

Registry 상태: UNPUBLISHED. 이 SDK는 저장소 소스 checkout에서만 설치하고 외부 package registry를 사용하지 마세요.

패키지 상태: 현재 패키지. JS 브리지, PKCE S256 흐름, 딥링크 콜백 핸들러, OS keychain 어댑터, Rust 플러그인 템플릿이 구현되었습니다. 프로덕션 인프라에서의 실제 IdP 왕복 테스트는 아직 수동 검증 대기 중입니다.

Tauri 설정

// tauri.conf.json
{
  "bundle": { "identifier": "com.example.myapp" },
  "plugins": {
    "deep-link": { "desktop": { "schemes": ["myapp"] } }
  }
}

Rust 플러그인

templates/xid-keychain-plugin.rssrc-tauri/src/xid_keychain.rs에 복사하고 templates/tauri-app-setup.rs를 참고하여 등록하세요. src-tauri/Cargo.tomlkeyring = \"2\", tauri-plugin-deep-link = \"2\", tauri-plugin-shell = \"2\"를 추가하세요.

JS 통합

import { createXidTauriClient, createTauriKeychainAdapter } from '@xid-kit/tauri'
import { invoke } from '@tauri-apps/api/core'
import { open } from '@tauri-apps/plugin-shell'
import { onOpenUrl } from '@tauri-apps/plugin-deep-link'

const client = createXidTauriClient({
  issuer: 'https://xid.dev',
  clientId: 'YOUR_CLIENT_ID',
  redirectUri: 'myapp://auth/callback',
  keychain: createTauriKeychainAdapter({ invoke }),
})

// Register deeplink handler (e.g. on App component mount)
await onOpenUrl(async (urls) => {
  for (const url of urls) await client.handleRedirect(url)
})

// Trigger sign-in: opens system browser
await client.signIn({ openUrl: open })

토큰 검색 및 로그아웃

// Get the current unexpired access token. Expiry requires a new sign-in.
const token = await client.getAccessToken()

// Get the current unexpired session (userId, organizationId, expiresAt).
const session = await client.getSession()

// Clear local keychain state. No refresh or revoke request is sent.
await client.signOut()

// To request full IdP sign-out, open an explicit OIDC RP-initiated logout URL.
const logoutUrl = client.buildSignOutUrl({ postLogoutRedirectUri: 'myapp://logout' })
await open(logoutUrl.toString())

Tauri 런타임 없이 개발/테스트

import { createXidTauriClient, createMemoryKeychainAdapter } from '@xid-kit/tauri'

const client = createXidTauriClient({
  issuer: 'http://localhost:8788',
  clientId: 'test-client',
  redirectUri: 'http://localhost:1420/callback',
  keychain: createMemoryKeychainAdapter(),
})

createXidTauriClient 옵션

옵션 유형 설명
issuer string XID 발급자 URL
clientId string OAuth 2.0 client_id
redirectUri string 사용자 정의 URI 스킴 콜백
scopes readonly string[] 기본값: openid, profile, email
keychain XidKeychainAdapter 토큰 저장소 어댑터; 기본값은 MemoryKeychainAdapter입니다(프로덕션에서는 Tauri 어댑터 사용)

XidTauriClient 메서드

방법 설명
signIn(options?) PKCE 인증 URL 생성; openUrl 콜백을 통해 엽니다
handleRedirect(url) 딥링크를 파싱하고 state를 검증하며 코드를 토큰으로 교환합니다
getSession() 현재 만료되지 않은 로컬 session이면 TauriSession, 아니면 null입니다. 만료된 state는 지워집니다.
getAccessToken(options?) 현재 만료되지 않은 access token 문자열 또는 null입니다. refresh request는 수행하지 않습니다. DPoP가 구현될 때까지 SDK는 offline_access를 거부합니다.
signOut() revoke request 없이 로컬 keychain state 지우기
buildSignOutUrl(options?) RP 주도 로그아웃을 위한 OIDC end_session URL 생성
setTokenStorage(adapter) 런타임에 keychain 어댑터 교체

PKCE 및 토큰 저장소

  • PKCE S256이 항상 사용됩니다. Plain challenge는 절대 생성되지 않습니다.
  • 검증자 엔트로피는 64바이트입니다. challenge는 Web Crypto crypto.subtle.digest('SHA-256', ...)를 통해 파생됩니다.
  • 모든 key는 xid.* namespace에 속합니다. 현재 사용하는 key는 xid.access_token입니다. xid.refresh_token은 legacy cleanup 용도로만 삭제됩니다. xid.session, xid.pkce_verifier, xid.oauth_state에는 현재 session과 authorization state가 저장되며 refresh credential을 읽거나 쓰지 않습니다.
탐색

입력하여 검색...

화살표 키로 이동Enter 키로 선택Escape 키로 닫기