FlutterでOAuthを実装しようとしたときに、OAuthを使おうとしたサービスがredirect_urlにCustom URL Schemeが使えなかった(http://~, https://以外許可されていなかった)ので、
リダイレクト先のHTTPサーバを立ててあげようとしたときのメモ。
import 'dart:io';
Future<void> main() async {
final server =
await HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 8080, shared: true);
listenForServerResponse(server);
}
listenForServerResponse(HttpServer server) {
server.listen((HttpRequest request) async {
final uri = request.uri;
request.response
..statusCode = 200
..headers.set("Content-Type", ContentType.HTML.mimeType);
final code = uri.queryParameters["code"];
final error = uri.queryParameters["error"];
await request.response.close();
if (code != null) {
print(code);
} else if (error != null) {
print(error);
}
});
}
エミュレータとかで試してないけど、こんなコードでRedirectされてきたURLのQueryParameterからCodeが取れるはず。
-
InternetAddress.LOOPBACK_IP_V4
は127.0.0.1
になっているはず - HttpServer.bindの2つ目の引数でポートを指定する。この場合
8080
-
shared: true
は他のHttpServerが同じアドレスにBindできるかどうかのフラグ(?)っぽい。別インスタンスのHttpServerを同じポートで複数建てられるってコト?!- https://api.flutter.dev/flutter/dart-io/HttpServer/bind.html
- ワーカーみたいにたくさんServerを立てられるってコトかも? -> Isolateが一緒だと結局遅くなりそうだけどどうなんだろうか
実行サンプル
> curl 'http://localhost:8080/?code=12345'
StatusCode : 200
StatusDescription : OK
Content :
RawContent : HTTP/1.1 200 OK
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
Content-Length: 0
Content-Type: text/html
Forms : {}
Headers : {[x-frame-options, SAMEORIGIN], [x-xss-protection, 1; mode=block], [x-content-type-options, nosniff], [Content-Length, 0]...}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 0
> dart .\main.dart
12345