--- title: "Sign in with Sonr: Developer Guide" description: "OAuth 2.0 authentication for decentralized applications with UCAN capabilities" sidebarTitle: "Sign in with Sonr" icon: "key" --- This guide covers OAuth 2.0 authentication for decentralized applications using Sonr's advanced Web3 capabilities. ## Overview Sign in with Sonr provides OAuth 2.0 authentication for decentralized applications, combining traditional OAuth flows with Web3 capabilities through UCAN (User Controlled Authorization Networks) delegation. Industry-standard authentication with OpenID Connect Passwordless authentication with hardware security Fine-grained permission delegation for Web3 W3C DID-based identity management ## Quick Start ### Installation ```bash npm npm install @sonr.io/ui ``` ```bash pnpm pnpm add @sonr.io/ui ``` ```bash yarn yarn add @sonr.io/ui ``` ### Basic Implementation ```tsx React import { SignInWithSonr } from '@sonr.io/ui'; function App() { return ( ); } ``` ## Configuration ### OAuth Client Registration ```typescript Configuration const clientConfig = { clientId: 'your-client-id', clientSecret: 'your-client-secret', // Only for confidential clients redirectUris: ['http://localhost:3000/callback'], grantTypes: ['authorization_code', 'refresh_token'], responseTypes: ['code'], scopes: ['openid', 'profile', 'vault:read', 'vault:write'], tokenEndpointAuthMethod: 'none', // For public clients }; ``` ### Environment Variables ```env OAuth Endpoints # OAuth Endpoints NEXT_PUBLIC_SONR_CLIENT_ID=your-client-id NEXT_PUBLIC_REDIRECT_URI=http://localhost:3000/callback NEXT_PUBLIC_AUTH_URL=https://auth.sonr.io/oauth/authorize NEXT_PUBLIC_TOKEN_URL=https://auth.sonr.io/oauth/token NEXT_PUBLIC_USERINFO_URL=https://auth.sonr.io/oauth/userinfo ``` ## OAuth Scopes & UCAN Capabilities
Scope Description UCAN Capabilities
`openid` OpenID Connect identity Basic identity claims
`profile` User profile information Name, picture, metadata
`email` Email address Email and verification status
`offline_access` Refresh token issuance Long-lived access
Scope Description UCAN Actions
`vault:read` Read vault contents `vault/read`, `vault/list`
`vault:write` Modify vault contents `vault/write`, `vault/create`, `vault/update`
`vault:delete` Delete vault items `vault/delete`
`vault:admin` Full vault control All vault actions
## Integration Examples ```tsx React Hooks import { useSignInWithSonr } from '@sonr.io/ui'; function LoginComponent() { const { user, token, isAuthenticated, isLoading, signIn, signOut, refreshToken, } = useSignInWithSonr({ clientId: 'your-client-id', redirectUri: 'http://localhost:3000/callback', scopes: ['openid', 'profile', 'vault:read'], }); if (isLoading) return
Loading...
; if (isAuthenticated) { return (

Welcome, {user.name}!

); } return ; } ```
```tsx Next.js Layout // app/layout.tsx import { AuthProvider } from '@/components/AuthProvider'; export default function RootLayout({ children }) { return ( {children} ); } ``` ```tsx Auth Provider 'use client'; import { createContext, useContext, useEffect, useState } from 'react'; import { OAuth2Client } from '@sonr.io/ui'; const AuthContext = createContext(); export function AuthProvider({ children }) { const [client] = useState(() => new OAuth2Client({ clientId: process.env.NEXT_PUBLIC_SONR_CLIENT_ID, redirectUri: process.env.NEXT_PUBLIC_REDIRECT_URI, })); // ... authentication logic return ( {children} ); } export const useAuth = () => useContext(AuthContext); ```
## Advanced Features ### Custom Authorization ```tsx Custom Authorization console.log('Starting auth...')} onAuthError={(error) => console.error('Auth failed:', error)} /> ``` ### Token Management ```typescript Token Management const client = new OAuth2Client(config); // Check authentication status if (client.isAuthenticated()) { // Get current access token const accessToken = client.getAccessToken(); // Refresh token before expiry const newToken = await client.refreshToken(); // Get user information const userInfo = await client.getUserInfo(); // Revoke tokens on logout await client.logout(); } ``` ## Security Considerations Always implement robust security practices when integrating authentication. ### PKCE Implementation ```typescript PKCE Configuration const client = new OAuth2Client({ clientId: 'public-client', pkce: true, // Enabled by default for public clients }); ``` ### State Parameter Prevention ```typescript State Validation // Generate random state const state = crypto.randomUUID(); sessionStorage.setItem('oauth_state', state); // Validate on callback const returnedState = params.get('state'); const savedState = sessionStorage.getItem('oauth_state'); if (returnedState !== savedState) { throw new Error('State mismatch - possible CSRF attack'); } ``` ## Troubleshooting - Ensure your redirect URI is whitelisted - Check allowed origins in OAuth server config - Authorization code can only be used once - Code expires after 10 minutes - Verify redirect URI matches exactly - Implement automatic refresh before expiry - Handle refresh token rotation Enable debug mode for additional troubleshooting insights: ```typescript const client = new OAuth2Client({ clientId: 'your-client-id', debug: true, // Enable console logging }); ``` ## API Reference ### SignInWithSonr Props ```typescript interface SignInWithSonrProps { clientId: string; redirectUri: string; authorizationUrl?: string; scopes?: string[]; state?: string; variant?: 'default' | 'outline' | 'ghost' | 'dark'; size?: 'default' | 'sm' | 'lg'; isLoading?: boolean; text?: string; showLogo?: boolean; onAuthStart?: () => void; onAuthError?: (error: Error) => void; } ``` ## Resources RFC 6749 - OAuth 2.0 Authorization Framework Core specification for identity layers User Controlled Authorization Networks Web Authentication API specification ## Support Report issues or contribute Explore full documentation Join our community