Как я могу войти в приложение Flutter с базовой аутентификацией Laravel, используя адрес электронной почты и пароль

После создания нового проекта Laravel я выполнял только аутентификацию с помощью php artisan make: auth. Мне нужно было получить токен CSRF для входа в приложение Flutter, поэтому я просто закомментировал токен CSRF в промежуточном программном обеспечении.

Я получаю ошибку 302, которая является ошибкой перенаправления. Меня перенаправили в «/ домой». Итак, я просто вернул «Данные пользователя» при успешном входе в систему, но все равно получаю ту же ошибку. Недостаточно документации о Flutter о том, как аутентифицироваться с помощью электронной почты и пароля, если у меня уже есть веб-сервис, развернутый в компании, предоставляющей веб-хостинг.

Если я установил базовую аутентификацию на Laravel, как я могу аутентифицироваться на Flutter? Мне сейчас не нужен токен CSRF для тестирования.

флаттер код входа

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:embedded_mobile/screens/home.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:embedded_mobile/models/user.dart';

var routes = <String, WidgetBuilder>{
  "/home": (BuildContext context) => HomeScreen(),
  "/login": (BuildContext context) => LoginWithRestfulApi(),
};

class LoginWithRestfulApi extends StatefulWidget {
  @override
  _LoginWithRestfulApiState createState() => _LoginWithRestfulApiState();
}

class _LoginWithRestfulApiState extends State<LoginWithRestfulApi>
    with TickerProviderStateMixin {
  static var uri = "http://blackboardembedded.dx.am";

  static BaseOptions options = BaseOptions(
      baseUrl: uri,
      responseType: ResponseType.plain,
      connectTimeout: 30000,
      receiveTimeout: 30000,
      followRedirects: false,
      validateStatus: (code) {
        return code < 500;
      });

  static Dio dio = Dio(options);

  GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

  TextEditingController _emailController = TextEditingController();

  TextEditingController _passwordController = TextEditingController();

  bool _isLoading = false;

  Future<bool> _onBackPressed() {}

  Future<dynamic> _loginUser(String email, String password) async {
    try {
      Options options = Options(
        contentType: ContentType.parse('application/json'),
      );

      Response response = await dio.post('/login',
          data: {"email": email, "password": password}, options: options);

      if (response.statusCode == 200 ||
          response.statusCode == 201 )  {
        var responseJson = json.decode(response.data);
        return responseJson;
      } else if (response.statusCode == 401) {
        throw Exception("Incorrect Email/Password");
      } else
        throw Exception('Authentication Error');
    } on DioError catch (exception) {
      if (exception == null ||
          exception.toString().contains('SocketException')) {
        throw Exception("Network Error");
      } else if (exception.type == DioErrorType.RECEIVE_TIMEOUT ||
          exception.type == DioErrorType.CONNECT_TIMEOUT) {
        throw Exception(
            "Could'nt connect, please ensure you have a stable network.");
      } else {
        return null;
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,
      appBar: AppBar(
          leading: new IconButton(
            icon: new Icon(Icons.arrow_back, color: Colors.black),
            onPressed: () => Navigator.of(context).pushNamed('/login'),
          ),
          title: Text("Send Location")),
      body: Center(
        child: Container(
          child: _isLoading
              ? CircularProgressIndicator()
              : Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Padding(
                      padding: const EdgeInsets.all(20.0),
                      child: TextField(
                        controller: _emailController,
                        decoration: InputDecoration(
                          hintText: 'Email',
                        ),
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.all(20.0),
                      child: TextField(
                        controller: _passwordController,
                        decoration: InputDecoration(
                          hintText: 'Password',
                        ),
                      ),
                    ),
                    new SizedBox(
                      width: 200,
                      height: 50,
                      child: RaisedButton(
                        shape: new RoundedRectangleBorder(
                            borderRadius: new BorderRadius.circular(50.0)),
                        child: Text("Login"),
                        color: Colors.amber,
                        onPressed: () async {
                          setState(() => _isLoading = true);
                          var res = await _loginUser(
                              _emailController.text, _passwordController.text);
                          setState(() => _isLoading = false);

                          JsonUser user = JsonUser.fromJson(res);
                          if (user != null) {
                            Navigator.of(context).push(MaterialPageRoute<Null>(
                                builder: (BuildContext context) {
                              return new LoginScreen(
                                user: user,
                              );
                            }));
                          } else {
                            Scaffold.of(context).showSnackBar(SnackBar(
                                content:
                                    Text("Email or password is incorrect")));
                          }
                        },
                      ),
                    ),
                  ],
                ),
        ),
      ),
    );
  }
}

class LoginScreen extends StatelessWidget {
  LoginScreen({@required this.user});

  final JsonUser user;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Login Screen")),
      body: Center(
        child: user != null
            ? Text("Logged IN \n \n Email: ${user.email} ")
            : Text("Yore not Logged IN"),
      ),
    );
  }
}

person jay jay    schedule 20.09.2019    source источник


Ответы (1)


для вашего приложения вам необходимо аутентифицировать пользователей по маршрутам api, для чего по умолчанию не требуются токены CSRF. вы можете добиться этого с помощью Laravel Passport или JWT auth

person emeka mamah    schedule 25.10.2019