首页 > 解决方案 > 为 SPA 的授权代码流配置 Identity Server 3 的正确方法是什么?

问题描述

我们有一个 Identity Server 3 的实例,它已经与各种客户端一起使用了一段时间,一些使用隐式流,另一些使用客户端凭据。我们现在有一个新的要求,将 iOS 原生应用程序与此身份提供者集成。我知道这些天不建议使用隐式流程,而面向公众的应用程序应该使用授权代码流程。此类建议的示例在此处此处

据我了解,授权代码流有一个步骤,通过将接收到的授权代码与客户端 ID 和机密一起提供,通过某个反向通道将接收到的授权代码交换为 JWT 令牌。但是,对于 SPA 和本地应用程序,我们没有存储秘密的奢侈。我在这里找到的指导建议我可以简单地从connect/token请求中省略秘密,但到目前为止我的测试并没有证实这一点。所以我被困住了。为了演示,我在我的本地 IS3 实例上设置了一个客户端来测试:

{
    'clientId': 'test',
    'flow': 'AuthorizationCode',
    'name': 'test',
    'redirectUris': [ 'http://localhost:8080/' ], 
    'scopes': ['openid','profile']
}

然后,我向 IdP 提出以下GET请求:

[ID_PROVIDER]/connect/authorize?client_id=test&redirect_uri=http%3A%2F%2Flocalhost%3A8080&scope=openid%20profile&response_type=code

这让我可以登录并返回到在http://localhost:8080上运行的测试应用程序,并在查询字符串中使用我的授权代码。

我现在尝试通过使用以下正文将此代码交换为 JWTPOST令牌[ID_PROVIDER]/connect/tokencode=[AUTH_CODE]&grant_type=authorization_code&client_id=test&redirect_uri=http%3A%2F%2Flocalhost%3A8080

但 Identity Server 拒绝此操作并返回 HTTP 400 和invalid_client错误。当我深入研究它的日志时,我看到一个ClientSecretValidator带有“未找到客户端密码”消息的事件。根据我上面概述的理解,哪种是有意义的,但是鉴于人们建议将此流程用于面向公众的应用程序,我一定是误解了一些东西。

如果有人能澄清一下,那就太好了,谢谢。

标签: asp.netauthenticationopenid-connectidentityserver3

解决方案


您不能只省略客户端密码。对于您的本地情况,我会考虑将秘密嵌入应用程序中。授权请求仍然必须验证 return_uri(您的本地应用程序的自定义 URI 方案),如果仍然感觉不安全,您还可以依靠拥有证明 (PoP) 令牌(https://identityserver.github.io/Documentation /docsv2/pop/overview.html)。

对于 SPA 应用程序,我会保留它的隐式流程,我认为在那里做秘密没有意义。


推荐阅读