使用openid_client通过带有ke​​ycloak的pkce颤振应用程序进行身份验证后如何获取刷新令牌?

Posted

技术标签:

【中文标题】使用openid_client通过带有ke​​ycloak的pkce颤振应用程序进行身份验证后如何获取刷新令牌?【英文标题】:How to get refresh token after authenticate via pkce flutter app with keycloak using openid_client? 【发布时间】:2022-01-16 10:25:47 【问题描述】:

我有以下 KeyCloak 客户端配置,以使用 pkce 身份验证流程:

Realm: REALM

Client ID:              pkce-client
Client Protocol:        openid-connect
Access Type:            public
Standard Flow Enabled:  ON
Valid Redirect URIs:    http://localhost:4200/ 

Advanced Settings:
Proof Key for Code Exchange Code Challenge Method: S256

当通过 openid_client 使用 ios 模拟器使用 Flutter App 进行身份验证时 https://pub.dev/packages/openid_client这样的

  authenticate() async 

    var uri = Uri.parse('http://$localhost:8180/auth/realms/REALM');
    var clientId = 'pkce-client';
    var scopes = List<String>.of(['profile', 'openid']);
    var port = 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,
    );

    var auth = await authenticator.authorize();
    var token= await auth.getTokenResponse();
    return token;
  

我收到以下回复:

如何使用刷新令牌获取新的访问令牌?

我试过了:

POST http://localhost:8180/auth/realms/REALM/protocol/openid-connect/token
Content-Type: application/x-www-form-urlencoded
client_id: pkce-client
grant_type: refresh_token
refresh_token: "received refresh token"

但我明白了:

"error":"invalid_client","error_description":"Invalid client credentials"

我需要如何准备刷新访问令牌的请求?

提前致谢

【问题讨论】:

【参考方案1】:

问题的一个原因可能是您需要在请求中也包含 client_secret。如果客户是“机密”客户,则可能需要这样做。

请参阅此处的讨论以获取更多详细信息。 Refresh access_token via refresh_token in Keycloak

【讨论】:

我使用的是pkce,所以我的客户端没有client_secret。我是否需要在另一个具有 client_secret 的客户端上检索刷新令牌?我想避免在应用中使用 client_secret。 PKCE和client_secret没有关系? 访问类型是公开的,所以没有提供client_secret。

以上是关于使用openid_client通过带有ke​​ycloak的pkce颤振应用程序进行身份验证后如何获取刷新令牌?的主要内容,如果未能解决你的问题,请参考以下文章

使用 keycloak 和 openid_client 对 Flutter 应用程序进行身份验证

yc是啥意思?

带有自签名 ssl 证书的 prometheus 的 Https

从零开始学YC-Framework之初步

kindeditor 编辑器php的详细配置方法

带有 master.key 的 Rails 5.2 - Heroku 部署