Dokümantasyon

Touchque Login

Kendi müşterileriniz için, kendi markanız ve alan adınızda kayıt ve giriş sayfaları: önce passkey, ikinci adım olarak Touchque uygulaması ya da e-posta/SMS kodu, sosyal ve kurumsal bağlantılar, kurumsal müşteriler için organizasyonlar. Sayfalar sizin logonuzu ve renklerinizi taşır, altta her zaman küçük bir “Touchque ile korunuyor” satırı bulunur. Standart OpenID Connect'tir; her OIDC kütüphanesi çalışır, aşağıdaki SDK'lar ayrıntıları sizin yerinize halleder.

Beş dakikada
Giriş alan adınızdaki uç noktalar
YolNe
/.well-known/openid-configurationKeşif
/authorizescreen_hint=signup, login_hint, ui_locales, connection, organization, invitation, prompt, max_age, acr_values
/oauth/tokenauthorization_code (PKCE), refresh_token (her kullanımda döner), client_credentials, jeton değişimi (RFC 8693), CIBA
/bc-authorizeCIBA (yoklama): bir uygulama müşteriden telefonunda onay ister
/userinfo · /oauth/revoke · /oauth/introspectOpenID Connect ve OAuth 2.0
/oidc/logoutid_token_hint, post_logout_redirect_uri
/accountMüşterilerinizin kendi hesap sayfası
/me/v1My Account API (audience {issuer}/me/, birinci taraf uygulamalar)
Hep açık: her girişte PKCE (S256) ve state, birebir callback adresleri, yanıtta issuer (RFC 9207), JWKS'e karşı doğrulanan ID token'lar, her kullanımda dönen refresh token'lar (tekrar kullanılan tüm aileyi bitirir), Argon2id ile saklanan ve sızıntı listelerine karşı denetlenen parolalar.
Saldırı koruması
KorumaNe yapar
Yanlış parolalar15 dakikada 10 yanlış parola o hesapta parolayla girişi durdurur; sahibine kilit açma bağlantısı gider.
Şüpheli adreslerBir adresten birçok hesapta başarısız giriş: bot kontrolü ya da bir saat bekleme.
Bot kontrolüTurnstile, hCaptcha ya da reCAPTCHA v2; sunucuda hostname ile doğrulanır.
Sızmış parolalarGirişte bulunursa: ikinci adımdan sonra yeni parola ya da e-posta.
Uyarlanabilir ikinci adımYalnızca riskli görünen girişte sorulur (yeni tarayıcı, şüpheli adres, başarısız denemeler, risk motoru).

Actions'larınız girişte de çalışır: identity.post_login reddedebilir ya da ikinci adım isteyebilir, identity.pre_user_registration bir kaydı reddedebilir. Müşteriler profillerini, passkey'lerini, cihazlarını, uygulama erişimlerini ve verilerini /account'ta ya da sizin uygulamanızda My Account API ve <UserProfile> ile yönetir.

Bir müşteri adına çalışan yapay zekâ ajanı

Bir gizli uygulama için açın (Touchque Login → Setup → Apps → uygulama → Acting for your customers; telefonunuz onaylar). Jeton değişimi (RFC 8693) ile uygulama, giriş yapmış bir müşterinin erişim jetonunu API'nizi çağırmak için bir jetonla değiştirir: sub müşteri, act.sub uygulamadır; kapsamlar API'nin uygulamaya verdikleridir (ve müşterinin rollerinin izin verdikleri), müşterinin jetonuyla biter; zincirdeki üçüncü uygulama reddedilir. CIBA ile uygulama müşteriye telefonunda sorar: Touchque authorization_details'i satırlar halinde çizer, önce uygulamanın adını, mesajını doğrulanmamış olarak gösterir, Face ID ve uygulamanın gösterdiği sayıyı ister; jetonlar tam olarak onaylananı bir kez taşır. Telefon görüşmesi sırasında verilen onay yetmez.

Jeton kasası. Bir bağlantı jetonları saklıyorsa (Touchque Login → Setup → Connections → bağlantı → Keep tokens for apps working for people; telefonunuz onaylar), müşteri adına çalışan bir uygulama o müşterinin kendi Google, Microsoft ya da GitHub erişim jetonunu requested_token_type=urn:touchque:params:oauth:token-type:connection-access-token ve connection ile jeton değişiminden alır. Touchque jetonları şifreli saklar, yeniler ve yenileme jetonunu asla vermez; scope yalnızca sağlayıcının verdiğini daraltabilir. Müşterinin jetonu uygulamanın kendisine verilmiş olmalıdır, bağlantı uygulamayı listelemiyorsa. Müşteriler bunu /account'ta (ya da stopAppAccess ile), siz DELETE /identity/users/{id}/connected-accounts/{accountId} ile kapatırsınız; hesabın bağlantısını kesmek ya da müşteriyi silmek jetonları da siler.

Kullanıcılarınızı giriş yaptırın
Bu blokta henüz JavaScript örneği yok; Next.js gösteriliyor.
// npm init @touchque -- --login   (writes these files)
// lib/touchque.ts
import { createTouchqueLogin } from '@touchque/node';
export const touchque = createTouchqueLogin({
  domain: ({}).TOUCHQUE_LOGIN_DOMAIN!,      // acme.login.touchque.com
  clientId: ({}).TOUCHQUE_LOGIN_CLIENT_ID!,
  clientSecret: ({}).TOUCHQUE_LOGIN_CLIENT_SECRET,
  secret: ({}).TOUCHQUE_SESSION_SECRET!,    // 32+ random characters
  appUrl: ({}).APP_URL!,
});

// app/auth/[action]/route.ts
export const { GET } = touchque.handlers;

// middleware.ts (Edge)
import { touchqueMiddleware } from '@touchque/node/next/middleware';
export default touchqueMiddleware({ secret: ({}).TOUCHQUE_SESSION_SECRET!, protect: ['/dashboard'] });
Yönetim API'si (API anahtarınız)
const { users } = await tq.identity.users.list({ q: 'ayse' });
await tq.identity.users.block(users[0].id, { reason: 'chargeback' });
const job = await tq.identity.imports.start({ users: [{ email: 'old@acme.com', passwordHash: '$2b$10$…' }] });
await tq.identity.setDelivery('email', { provider: 'postmark', from: 'login@acme.com', serverToken });
await tq.identity.setAttackProtection({ bot: { provider: 'turnstile', siteKey, secret, mode: 'risky' } });
const data = await tq.identity.users.export(userId);   // KVKK / GDPR
Müşteri adına çalışan ajan
// An AI agent of yours (a confidential app with these grants on, Touchque Login → Setup → Apps → the app)
const forAda = await login.exchangeToken(adasAccessToken, { audience: 'https://api.acme.com' });   // sub = Ada, act.sub = the app

const ask = await login.askUser({ loginHint: 'ada@acme.com', scope: 'openid payments:create', audience: 'https://api.acme.com',
    bindingMessage: 'Pay invoice 42', authorizationDetails: [payment] });
reply(`Type ${ask.bindingCode} in the Touchque app`);
const approved = await login.waitForUser(ask);   // approved.authorizationDetails

// Token vault: Ada's own Google token (Touchque Login → Setup → Connections → Google → Keep tokens…)
const google = await login.getConnectionToken(adasAccessToken, { connection: 'google' });
await fetch('https://www.googleapis.com/calendar/v3/users/me/calendarList', { headers: { Authorization: `Bearer ${google.accessToken}` } });