Привет, ребята!
Я создаю приложение Flutter и хочу реализовать вход в систему через веб-браузер в приложении при нажатии кнопки входа в систему. нажата.
Вот ссылка:
https://XXX.sandbox.my.site.com/service ... irect_uri=$ redirectUri;
При входе в систему я получаю этот URL-адрес в качестве redirect_uri:
https://XXX.sandbox.my.site.com/service ... 2/callback
и он предоставляет мне этот URL-адрес:
https://XXX.sandbox.my.site.com/service ... e3R.jww%3D %3D&sfdc_community_url=https://XXX.sandbox.my.site.com&sfdc_community_id=0DB7Q000001MvPYWA0
Я хочу извлечь параметр кода из этого URL-адреса и сохранить его локально для последующего процесса в моем Flutter app.
В настоящее время у меня есть этот код, но когда я вхожу в систему и получаю перенаправление на обратный вызов, где я хочу извлечь код, ничего не происходит. Кто-нибудь знает, что я делаю неправильно или чего мне не хватает?
Мой код экрана входа:
Код: Выделить всё
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_web_browser/flutter_web_browser.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:uni_links/uni_links.dart';
class LoginScreen extends StatefulWidget {
const LoginScreen({Key? key}) : super(key: key);
@override
_LoginScreenState createState() => _LoginScreenState();
}
class _LoginScreenState extends State {
var _isLoading = false;
final String clientId = 'CLIENT_ID';
final String clientSecret = 'CLIENT_SECRET';
final String redirectUri = 'https://XXX.sandbox.my.site.com/services/oauth2/callback';
late StreamSubscription _sub;
@override
void initState() {
super.initState();
initUniLinks();
}
void initUniLinks() async {
await initPlatformState();
_sub = uriLinkStream.listen((Uri? uri) {
print('Got url: $uri');
if (uri != null && uri.queryParameters.containsKey('code')) {
String code = uri.queryParameters['code']!;
print('Get code: $code');
_getToken(code);
}
}, onError: (err) {
print('Error: $err');
});
}
Future initPlatformState() async {
await Future.delayed(Duration(seconds: 1));
}
@override
void dispose() {
_sub.cancel();
super.dispose();
}
void _tryLogin() async {
setState(() {
_isLoading = true;
});
String authUrl =
'https://XXX.sandbox.my.site.com/services/oauth2/authorize?response_type=code&client_id=$clientId&redirect_uri=$redirectUri';
await FlutterWebBrowser.openWebPage(url: authUrl);
setState(() {
_isLoading = false;
});
}
Future _getToken(String code) async {
final response = await http.post(
Uri.parse('https://XXX.sandbox.my.site.com/services/oauth2/token'),
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body: {
'grant_type': 'authorization_code',
'code': code,
'client_id': clientId,
'client_secret': clientSecret,
'redirect_uri': redirectUri,
},
);
if (response.statusCode == 200) {
print('Response: ${response.body}');
final data = jsonDecode(response.body);
print('Access Token: ${data['access_token']}');
} else {
//TODO: Handle login failure
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Sign in'),
),
body: SafeArea(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (_isLoading)
const CircularProgressIndicator()
else
ElevatedButton(
onPressed: _tryLogin,
style: ElevatedButton.styleFrom(
minimumSize: const Size.fromHeight(50),
textStyle: const TextStyle(fontSize: 18),
),
child: const Text('Sign in'),
),
],
),
),
),
);
}
}
Код: Выделить всё
Источник: https://stackoverflow.com/questions/781 ... lutter-app
Мобильная версия