OAuth — это открытый стандарт авторизации, который позволяет приложениям получать ограниченный доступ к пользовательским данным на других сервисах без раскрытия паролей.
import { GoogleOAuthProvider, GoogleLogin } from '@react-oauth/google';
import jwt_decode from 'jwt-decode';
function OAuthButton() {
return (
<GoogleOAuthProvider clientId="YOUR_GOOGLE_CLIENT_ID">
<GoogleLogin
onSuccess={credentialResponse => {
const decoded = jwt_decode(credentialResponse.credential);
console.log('User data:', decoded);
// Отправка токена на ваш бэкенд для верификации
}}
onError={() => {
console.log('Login Failed');
}}
/>
</GoogleOAuthProvider>
);
}
async function initiateOAuth() {
// Генерируем code_verifier и code_challenge
const codeVerifier = generateRandomString();
localStorage.setItem('code_verifier', codeVerifier);
const params = new URLSearchParams({
client_id: 'YOUR_CLIENT_ID',
redirect_uri: 'http://localhost:3000/callback',
response_type: 'code',
scope: 'openid profile email',
code_challenge: await generateCodeChallenge(codeVerifier),
code_challenge_method: 'S256',
});
window.location.href = `https://auth-server.com/authorize?${params}`;
}
// Обработка callback после перенаправления
function handleCallback() {
const params = new URLSearchParams(window.location.search);
const code = params.get('code');
if (code) {
exchangeCodeForToken(code);
}
}
async function exchangeCodeForToken(code) {
const codeVerifier = localStorage.getItem('code_verifier');
const response = await fetch('https://auth-server.com/token', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
client_id: 'YOUR_CLIENT_ID',
grant_type: 'authorization_code',
code,
redirect_uri: 'http://localhost:3000/callback',
code_verifier: codeVerifier,
}),
});
const { access_token, refresh_token } = await response.json();
// Сохраняем токены и получаем данные пользователя
}
После получения OAuth-токена его нужно верифицировать на вашем сервере:
// Отправка токена на бэкенд
async function verifyToken(oauthToken) {
const response = await fetch('/api/auth/oauth', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ token: oauthToken })
});
const { user, token } = await response.json();
// Сохраняем JWT от вашего сервера
localStorage.setItem('jwt', token);
}
const OAuthProviders = {
google: {
init: () => import('@react-oauth/google'),
component: 'GoogleLogin'
},
facebook: {
init: () => import('react-facebook-login'),
component: 'FacebookLogin'
}
};
function AuthPage() {
const [providers, setProviders] = useState({});
useEffect(() => {
// Динамическая загрузка провайдеров
Object.entries(OAuthProviders).forEach(async ([key, config]) => {
const module = await config.init();
setProviders(prev => ({ ...prev, [key]: module[config.component] }));
});
}, []);
return (
<div>
{providers.google && (
<providers.google
clientId="GOOGLE_CLIENT_ID"
onSuccess={handleGoogleSuccess}
/>
)}
{providers.facebook && (
<providers.facebook
appId="FACEBOOK_APP_ID"
callback={handleFacebookResponse}
/>
)}
</div>
);
}
OAuth в React-приложениях реализуется через специализированные библиотеки или вручную с использованием PKCE Flow. Всегда верифицируйте токены на своем сервере и соблюдайте меры безопасности. Для production-приложений рассмотрите использование Auth0 или Firebase Authentication для упрощения реализации.