Flutter: как я передаю JWT-токен в заголовках?

#node.js #flutter #http-headers #token #apollo

#node.js #флаттер #http-заголовки #токен #apollo

Вопрос:

Я хочу передать токен в заголовки («Авторизация»: «Предъявитель» getToken). В противном случае я не смогу внести мутацию, потому что пользователь идентифицируется с токеном в заголовках. Нужно ли что-нибудь делать в функции мутации? Например, в функции мутации добавлять заголовки? Я использую пакет graphql_flutter.

Серверная часть: NodeJS — Apollo.

вот мой код:

Главная:

 import 'package:flutter/material.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import './pages/auth_screen.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'pages/auth_add_address_screen.dart';
import './client.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Config.functionGetToken();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  Future<String> getTheToken() async {
    SharedPreferences _prefs = await SharedPreferences.getInstance();
    String token = _prefs.getString("token");
    return token;
  }

  @override
  Widget build(BuildContext context) {
    return GraphQLProvider(
      client: Config.initailizeClient(),
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          unselectedWidgetColor: Colors.white60,
          primarySwatch: Colors.blue,
          visualDensity: VisualDensity.adaptivePlatformDensity,
        ),
        home: AuthScreen(),
        routes: {
          AuthAddAddress.routeName: (ctx) => AuthAddAddress(),
          AuthScreen.routeName: (ctx) => AuthScreen(),
        },
      ),
    );
  }
}
 

клиент:

 import 'package:flutter/material.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';

class Config {
  static SharedPreferences pref;

  static final HttpLink httpLink = HttpLink(
      uri: 'http://10.0.2.2:4000/graphql',
      headers: {"Authorization": "Bearer "   pref.getString("token")});

  static final AuthLink authLink =
      AuthLink(getToken: () => pref.getString("token"));

  static final Link link = authLink.concat(httpLink);

  static String token;

  static functionGetToken() async {
    pref = await SharedPreferences.getInstance();
  }

  static ValueNotifier<GraphQLClient> initailizeClient() {
    ValueNotifier<GraphQLClient> client = ValueNotifier(
      GraphQLClient(
        cache: OptimisticCache(dataIdFromObject: typenameDataIdFromObject),
        link: link,
      ),
    );
    return client;
  }
}
 

Вот мой метод onPressed(), в котором я получаю токен и устанавливаю его:

 onPressed: () async {
                        if (_authMode == AuthMode.Signup) {
                          if (_userRegGlobalKey.currentState.validate()) {
                            var userMutation = runMutation(
                              {
                                'email': _emailController.text,
                                'password': _passwordController.text,
                                'firstname': _firstnameController.text,
                                'lastname': _lastnameController.text,
                              },
                            );

                            var result = await userMutation.networkResu<


                            if (result.hasException) {
                              return Text(result.exception.toString());
                            }
                            if (result.loading) {
                              return Center(
                                child: Platform.isAndroid
                                    ? CircularProgressIndicator()
                                    : CupertinoActivityIndicator(),
                              );
                            } else {
                              String _token = await result
                                  .data["createUser"]["token"];
                              String _refreshToken = await result
                                  .data["createUser"]["refreshToken"];

                              if (_token != null amp;amp; _refreshToken != null) {
                                SharedPreferences pref =
                                    await SharedPreferences.getInstance();
                                pref.setString("token", _token);
                                pref.setString("refreshToken", _refreshToken);
                                print(_token);
                                print(_refreshToken);
                                Navigator.of(context)
                                    .pushNamed(AuthAddAddress.routeName);
                              }
                            }
                          }
                        }
                      },