rauth_flutter 2.0.41
rauth_flutter: ^2.0.41 copied to clipboard
RAuth v2 Flutter SDK - Cross-platform reverse authentication library for WhatsApp, Reverse SMS, OneID, and Passkey. Supports Android, iOS, and Web with dual SIM support, device info auto-detection, HM [...]
example/lib/main.dart
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:rauth_flutter/rauth_flutter.dart';
void main() {
// Initialize RAuth
Rauth.init(RauthConfig(
appId: 'your-app-id',
appSecret: 'your-app-secret',
debug: true,
));
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'RAuth Flutter Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const LoginPage(),
);
}
}
class LoginPage extends StatefulWidget {
const LoginPage({super.key});
@override
State<LoginPage> createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
final _phoneController = TextEditingController();
bool _isLoading = false;
String? _sessionToken;
String? _qrCodeBase64;
String? _status;
Future<void> _startSession() async {
setState(() {
_isLoading = true;
_status = 'Initializing session...';
});
try {
// Start session
final response = await Rauth.instance.startSession(
phone: _phoneController.text,
loginMethod: LoginMethod.whatsapp,
);
setState(() {
_sessionToken = response.sessionToken;
_qrCodeBase64 = response.regularWa?.qrbase64;
_status = 'Session created. Scan QR code or click WhatsApp link.';
});
// Await verification
_awaitVerification();
} catch (e) {
setState(() {
_status = 'Error: $e';
_isLoading = false;
});
}
}
Future<void> _awaitVerification() async {
try {
final status = await Rauth.instance.awaitVerification(
sessionToken: _sessionToken!,
phone: _phoneController.text,
);
setState(() {
_status = 'Verified via ${status.verifiedVia}!';
_isLoading = false;
});
// Send to backend
_sendToBackend(status);
} on TimeoutError {
setState(() {
_status = 'Verification timeout';
_isLoading = false;
});
} on SessionRevokedError {
setState(() {
_status = 'Session revoked';
_isLoading = false;
});
} catch (e) {
setState(() {
_status = 'Error: $e';
_isLoading = false;
});
}
}
Future<void> _sendToBackend(SessionStatusResponse status) async {
// Send session token to your backend
// final response = await http.post(
// Uri.parse('https://your-api.com/auth/login'),
// body: jsonEncode({
// 'session_token': status.token,
// 'phone': status.phone,
// }),
// );
// final jwt = jsonDecode(response.body)['token'];
// Store JWT and navigate to home
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('RAuth Login'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
controller: _phoneController,
decoration: const InputDecoration(
labelText: 'Phone Number',
hintText: '+1234567890',
),
keyboardType: TextInputType.phone,
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _isLoading ? null : _startSession,
child: _isLoading
? const CircularProgressIndicator()
: const Text('Start Login'),
),
if (_qrCodeBase64 != null) ...[
const SizedBox(height: 20),
Image.memory(
base64Decode(_qrCodeBase64!.split(',')[1]),
width: 200,
height: 200,
),
],
if (_status != null) ...[
const SizedBox(height: 20),
Text(_status!),
],
],
),
),
);
}
@override
void dispose() {
_phoneController.dispose();
super.dispose();
}
}