Flutter 使用KeyClope和openid_客户端验证Flatter应用程序

Flutter 使用KeyClope和openid_客户端验证Flatter应用程序,flutter,client,openid,keycloak,Flutter,Client,Openid,Keycloak,我正在尝试验证我的Flitter应用程序,以通过KeyClope 根据repo示例,我编写了一个如下的身份验证函数 authenticate() async { // parameters here just for the sake of the question var uri = Uri.parse('https://keycloak-url/auth/realms/myrealm'); var clientId = 'my_client_id'; var scopes

我正在尝试验证我的Flitter应用程序,以通过KeyClope

根据repo示例,我编写了一个如下的身份验证函数

authenticate() async {

  // parameters here just for the sake of the question
  var uri = Uri.parse('https://keycloak-url/auth/realms/myrealm');
  var clientId = 'my_client_id';
  var scopes = List<String>.of(['openid', 'profile']);
  var port = 4200;
  var redirectUri = Uri.parse('http://localhost:4200');

  var issuer = await Issuer.discover(uri);
  var client = new Client(issuer, clientId);

  urlLauncher(String url) async {
    if (await canLaunch(url)) {
      await launch(url, forceWebView: true);
    } else {
      throw 'Could not launch $url';
    }
  }

  var authenticator = new Authenticator(client,
      scopes: scopes,
      port: port,
      urlLancher: urlLauncher,
      redirectUri: redirectUri);

  var c = await authenticator.authorize();
  closeWebView();

  var token= await c.getTokenResponse();
  print(token);
  return token;
}
authenticate()异步{
//这里的参数只是为了这个问题
var uri=uri.parse('https://keycloak-url/auth/realms/myrealm');
var clientId='我的客户id';
var scopes=List.of(['openid','profile']);
var端口=4200;
var redirectUri=Uri.parse('http://localhost:4200');
var issuer=等待issuer.discover(uri);
var客户=新客户(发卡机构、客户ID);
url启动器(字符串url)异步{
如果(等待canLaunch(url)){
等待启动(url,forceWebView:true);
}否则{
抛出“无法启动$url”;
}
}
var验证器=新验证器(客户端,
范围:范围,
港口:港口,,
urlLancher:urlLauncher,
重定向URI:重定向URI);
var c=await authenticator.authorize();
closeWebView();
var token=wait c.getTokenResponse();
打印(代币);
返回令牌;
}
当我调用该函数时,会出现一个webview弹出窗口,我可以通过KeyClope登录,但当弹出窗口关闭时,我在
c.getTokenResponse()
中会遇到此错误:

发生异常。 NoSuchMethodError(NoSuchMethodError:对null调用了getter“length”。 收件人:空 已尝试呼叫:长度)

检查凭证
c
,我可以看到令牌响应只有“状态”、“会话状态”和“代码”字段


我遗漏了什么?

我已经在github()上得到了回答,所以我将把解决方案复制到这里:


在移动设备上,您应该使用PKCE流。当您在验证器构造函数中省略重定向uri时,会自动选择此选项

因此,它应该是:

var验证器=新验证器(客户端、,
范围:范围,
港口:港口,,
Urlancher:urlLauncher,);
确保添加uri
http://localhost:4200/
(包括尾部斜杠)到KeyClope中的
有效重定向URI


确保将uri(包括尾随斜杠)添加到KeyClope中的有效重定向uri。

是否必须为此打开浏览器窗口?openid_客户端插件在调用
Wait authenticator.authorize()时打开一个webview还有其他方法吗?您可以使用资源所有者密码流,但这是OAuth2而不是OpenID,出于安全原因,不建议使用。您还失去了SSO和联合提供者。