Auth Module README

Overview

The auth_module is a Flutter package designed to handle authentication-related functionalities seamlessly. This package includes features for requesting OTPs, verifying OTPs, managing authentication tokens, and providing authentication guards.

Features

  • Request OTP
  • Verify OTP
  • Manage authentication tokens
  • Authentication guards

Installation

To use this package, add the following dependency to your pubspec.yaml file:

dependencies:
auth_module:
path: ../ # Adjust the path as necessary

Run flutter pub get to install the package.

Usage

Initializing AuthBloc

First, initialize the AuthBloc in your Flutter application. Here is an example of setting up AuthBloc using MultiBlocProvider:

import 'package:auth_module/auth_module.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiBlocProvider(
      providers: [
        BlocProvider<AuthBloc>(
          create: (context) => AuthBloc(authService: MyAuthService()),
        ),
      ],
      child: MaterialApp(
        home: HomeScreen(),
      ),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Home')),
      body: Center(child: Text('Home Screen')),
    );
  }
}

Request OTP

To request an OTP, dispatch the RequestOtpEvent to the AuthBloc. Here is an example with a TextField for inputting the phone number:

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:auth_module/auth_module.dart';

class RequestOtpScreen extends StatelessWidget {
  final TextEditingController _phoneController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    final authBloc = BlocProvider.of<AuthBloc>(context);

    return Scaffold(
      appBar: AppBar(title: Text('Request OTP')),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _phoneController,
              decoration: InputDecoration(labelText: 'Phone Number'),
            ),
            ElevatedButton(
              onPressed: () {
                authBloc.add(RequestOtpEvent(phoneNumber: _phoneController.text));
              },
              child: Text('Request OTP'),
            ),
          ],
        ),
      ),
    );
  }
}

Verify OTP

To verify an OTP, dispatch the VerifyOtpEvent to the AuthBloc. Here is an example with TextFields for inputting the phone number and OTP:

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:auth_module/auth_module.dart';

class VerifyOtpScreen extends StatelessWidget {
  final TextEditingController _phoneController = TextEditingController();
  final TextEditingController _otpController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    final authBloc = BlocProvider.of<AuthBloc>(context);

    return Scaffold(
      appBar: AppBar(title: Text('Verify OTP')),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _phoneController,
              decoration: InputDecoration(labelText: 'Phone Number'),
            ),
            TextField(
              controller: _otpController,
              decoration: InputDecoration(labelText: 'OTP'),
            ),
            ElevatedButton(
              onPressed: () {
                authBloc.add(
                    VerifyOtpEvent(phoneNumber: _phoneController.text, otp: _otpController.text));
              },
              child: Text('Verify OTP'),
            ),
          ],
        ),
      ),
    );
  }
}

Implementing the Abstract AuthService Class

To implement the abstract AuthService class, extend it and provide concrete implementations for its methods:

import 'package:auth_module/auth_module.dart';

class MyAuthService extends AuthService {
  @override
  Future<AuthResponse> requestOtp(String phoneNumber) async {
// Implement your OTP request logic here
    return AuthResponse(isSuccessful: true, message: 'OTP requested successfully');
  }

  @override
  Future<AuthResponse> verifyOtp(String phoneNumber, String otp) async {
// Implement your OTP verification logic here
    return AuthResponse(isSuccessful: true, message: 'OTP verified successfully');
  }

  @override
  Future<AuthResponse> login(String username, String password) async {
// Implement your login logic here
    return AuthResponse(isSuccessful: true, message: 'Logged in successfully');
  }

  @override
  Future<void> logout() async {
// Implement your logout logic here
  }
}

Example Implementation

Refer to the example implementation in the ./example/ directory for a comprehensive demonstration of how to use the auth_module package.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Libraries

auth_module