#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);
}
}
}
}
},