使用 keycloak 和 openid_client 对 flutter 应用程序进行身份验证
Authenticate flutter app with keycloak and openid_client
我正在尝试通过 openid_client
向 keycloak 验证我的 flutter 应用程序
按照 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;
}
当我调用该函数时,出现一个 webview 弹出窗口,我可以通过 keycloak 登录,但是当弹出窗口关闭时,我在 c.getTokenResponse()
:
处收到此错误
Exception has occurred.
NoSuchMethodError (NoSuchMethodError: The getter 'length' was called on null.
Receiver: null
Tried calling: length)
检查凭据 c
,我可以看到 TokenResponse 只有 "state"、"session_state" 和 "code" 字段
我错过了什么?
我在 github (link) 上得到了回答,所以我将解决方案复制到这里:
在移动设备上,您应该使用 PKCE 流程。当您在 Authenticator 构造函数中省略重定向 uri 时,会自动选择它。
所以,应该是:
var authenticator = new Authenticator(client,
scopes: scopes,
port: port,
urlLancher: urlLauncher,);
确保将 uri http://localhost:4200/
(包括尾部斜杠)添加到 keycloak 中的 Valid Redirect URIs
。
确保将 uri http://localhost:4200/(包括尾部斜杠)添加到 keycloak 中的有效重定向 URI。
我正在尝试通过 openid_client
向 keycloak 验证我的 flutter 应用程序按照 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;
}
当我调用该函数时,出现一个 webview 弹出窗口,我可以通过 keycloak 登录,但是当弹出窗口关闭时,我在 c.getTokenResponse()
:
Exception has occurred. NoSuchMethodError (NoSuchMethodError: The getter 'length' was called on null. Receiver: null Tried calling: length)
检查凭据 c
,我可以看到 TokenResponse 只有 "state"、"session_state" 和 "code" 字段
我错过了什么?
我在 github (link) 上得到了回答,所以我将解决方案复制到这里:
在移动设备上,您应该使用 PKCE 流程。当您在 Authenticator 构造函数中省略重定向 uri 时,会自动选择它。
所以,应该是:
var authenticator = new Authenticator(client,
scopes: scopes,
port: port,
urlLancher: urlLauncher,);
确保将 uri http://localhost:4200/
(包括尾部斜杠)添加到 keycloak 中的 Valid Redirect URIs
。
确保将 uri http://localhost:4200/(包括尾部斜杠)添加到 keycloak 中的有效重定向 URI。