Аутентификация пользователя в Django через приложение Flutter и JSON Web Token - PullRequest
1 голос
/ 29 мая 2019

Как я могу аутентифицировать пользователя в Django-Rest-Framework через приложение Flutter?Я делал это раньше в Postman, и вот как я это сделал:

  1. Опубликовать запрос (IP: 8000 / get-token /)> Возвращает JSON Web Token
  2. Получить запрос с помощьюТокен на предъявителя (IP: 8000 / база данных / упражнения /)> Возвращает файл JSON!- Обратите внимание, что если я не использую токен, я ничего не получу взамен!

Как мне повторить это через запрос Flutter http.post?

Вот как явыполнит процесс регистрации (в данном случае не с токеном):

//text-field controllers
TextEditingController usernameController = TextEditingController();
TextEditingController passwordController = TextEditingController();

//post request
postRequest() async {
String _url = "IP:8000/get-token/";
var response = await http.post(
  Uri.encodeFull(_url),
  headers: { "Accept" : "application/json"},
  body: {
    "username": "${usernameController.text}",
    "password": "${passwordController.text}",
  },
  encoding: Encoding.getByName("utf-8"),
);

//Name TextField (Simplified Code)
Container(
  margin: EdgeInsets.only(bottom: 2, top: 25),
    child: TextField(
    controller: nameController,
      decoration: InputDecoration(
      hintText: "Name..."             
      ))
)

//Password TextField (Simplified Code)
Container(
  margin: EdgeInsets.only(bottom: 2, top: 25),
    child: TextField(
    controller: passwordController,
      decoration: InputDecoration(
      hintText: "Password..."             
      ))
)

//Simplified but you get what I mean
Inkwell(
  child: Container()
  onTap() 
  {
    postRequest(),
    Navigator.push(Into-App)
  }
)

Мой вопрос: как мне получить ответ на этот запрос?(если имя пользователя и пароль соответствуют базе данных).

И как мне использовать токен, который я получаю в ответ на запрос в будущем, чтобы получить данные внутри приложения?

Django-Backend:

#urls
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView

urlpatterns = [
    path('admin/', admin.site.urls),
    path('database/', include('PlanThatWorkout.urls')),
    path('get-token/', TokenObtainPairView.as_view()),
    path('refresh-token/', TokenRefreshView.as_view())
]

#settings
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES' : ('rest_framework.permissions.IsAuthenticated',),
'DEFAULT_AUTHENTICATION_CLASSES' : ('rest_framework_simplejwt.authentication.JWTAuthentication',),
}

1 Ответ

0 голосов
/ 30 мая 2019

Вы можете получить токен, расшифровав свой ответ с помощью dart: convert .

import 'dart:convert';
Map<String, dynamic> data = jsonDecode(reponse);
final jwt = data['jwt-key'];

Чтобы сохранить ваши данные, вы можете сохранить их на запись на диск в файл с path_provider :

import 'dart:async';
import 'dart:io';

import 'package:flutter/foundation.dart';
import 'package:path_provider/path_provider.dart';

Future<File> write(String jwt) async {
    final directory = await getApplicationDocumentsDirectory();
    final path = directory.path;
    final file = File('$path/jwt.txt');
    return file.writeAsString('$jwt');
}

Future<String> read() async {
    try { in a file or using 
      final directory = await getApplicationDocumentsDirectory();
      final path = directory.path;
      final file = File('$path/jwt.txt');
      String contents = await file.readAsString();
      return contents;
    } catch (e) {
      return '';
    }
  }

или с использованием shared_preferences .

...