Я пытаюсь использовать Flutter Dart для аутентификации в Trello, используя пакет url_launcher, основанный на публикации в блоге Кевина Сего, вместе с документацией по авторизации Trello.
Мой код отображает страницу авторизации Trello и вызывает URL-адрес обратного вызова, но я не могу получить токен (который передается как фрагмент URL-адреса), недоступный для HTTP-запроса. Однако на экране четко отображается URL с токеном в виде фрагмента в URL.
class TrelloAuthenticator {
Future<String> authorize() async {
Stream<String> onCode = await _server();
var url = "https://trello.com/1/authorize?expiration=30days&name=TestApp&callback_method=fragment&scope=read,write&return_url=http://localhost:8080&key=ab1234ab1234ab1234ab1234";
print("modifiedUrl:$url");
if (await canLaunch(url)) {
await launch(url);
} else {
throw 'Could not launch $url';
}
final String token = await onCode.first;
return token;
}
Future<Stream<String>> _server() async {
final StreamController<String> onCode = new StreamController();
HttpServer server = await HttpServer.bind(InternetAddress.loopbackIPv4, 8080);
server.listen((HttpRequest request) async {
print("_server method:${request.method}");
print("_server contentType:${request.headers.contentType}");
print("_server requestedUri:${request.requestedUri}");
print("_server requestedUri hasFragment:${request.requestedUri.hasFragment}");
print("_server requestedUri fragment:${request.requestedUri.fragment}");
print("_server requestedUri data:${request.requestedUri.data}");
print("_server requestedUri origin:${request.requestedUri.origin}");
print("_server requestedUri query:${request.requestedUri.query}");
print("_server requestedUri queryParameters:${request.requestedUri.queryParameters}");
print("_server requestedUri normalizePath:${request.requestedUri.normalizePath()}");
print("_server requestedUri normalizePath queryParametersAll:${request.requestedUri.normalizePath().queryParametersAll}");
print("_server requestedUri normalizePath hasFragment:${request.requestedUri.normalizePath().hasFragment}");
print("_server requestedUri normalizePath fragment:${request.requestedUri.normalizePath().fragment}");
print("_server uri:${request.uri}");
print("_server hasFragment:${request.uri.hasFragment}");
print("_server Fragment:${request.uri.fragment}");
print("_server parm count:${request.uri.queryParameters.length}");
for (int i = 0; i <request.uri.queryParameters.length; i++ ) {
print("_server parm:${request.uri.queryParameters[i]}");
}
final String token = request.uri.fragment;
request.response
..statusCode = 200
..headers.set("Content-Type", ContentType.html.mimeType)
..write("<html><h1>Notice the token in the URL fragment above</h1></html>");
await request.response.close();
await server.close(force: true);
onCode.add(token);
await onCode.close();
});
return onCode.stream;
}
Вот ссылки:
Сообщение в блоге Кевина Сего: https://medium.com/@segaud.kevin/facebook-oauth-login-flow-with-flutter-9adb717c9f2e
Авторизация Trello: https://developers.trello.com/page/authorization
И изображение эмулятора:
![Trello authorization page](https://i.stack.imgur.com/No3uS.png)
![Call back to local server - notice the token as a fragment](https://i.stack.imgur.com/Drv35.png)