客户端的客户端密码验证失败,授权代码流中的客户端密码无效

Posted

技术标签:

【中文标题】客户端的客户端密码验证失败,授权代码流中的客户端密码无效【英文标题】:Client secret validation failed for client, Invalid client secret on Authirization code flow 【发布时间】:2020-09-03 07:15:45 【问题描述】:

我在身份服务器 4 中使用 OIDC 客户端 JS,反应不断收到错误

Client secret validation failed for client, Invalid client secret

关于授权码流程,

Oidc 设置

private getClientSettings(): any 
    return 
      authority: "https://localhost:5001",
      client_id: "Local",
      redirect_uri: "https://localhost:5001/auth-callback",
      post_logout_redirect_uri: "https://localhost:5001",
      response_type: "code",
      scope: "profile openid email IdentityPortal.API offline_access",
      //filterProtocolClaims: environment.openID.filterProtocolClaims,
      loadUserInfo: true,
      monitorSession: true,
      silent_redirect_uri: "https://localhost:5001/silent-reniew.html",
      accessTokenExpiringNotificationTime: 20, //default 60
      checkSessionInterval: 5000, //default 2000
      silentRequestTimeout: 2000,
    ;
  

身份服务器 4 配置

public static IEnumerable<Client> GetClients()
        
            // client credentials client
            return new List<Client>
            
                new Client
                
                    ClientId = "Local",
                    //ClientName = "Local",
                    AllowedCorsOrigins = new List<string>  "http://localhost:4200","https://localhost:4200" ,
                    AllowedGrantTypes = GrantTypes.Code,
                    AllowAccessTokensViaBrowser = true,
                    AccessTokenLifetime=86400,
                    RequireConsent = false,
                    UpdateAccessTokenClaimsOnRefresh = true,
                    RedirectUris = LocalRedirectUris(),
                    PostLogoutRedirectUris = LocalRedirectUris(),
                    AllowedScopes = AllowedScopes(),
                    AllowOfflineAccess = true,
                
            ;
        

来自身份服务器的日志

info: IdentityServer4.Hosting.IdentityServerMiddleware[0]
      Invoking IdentityServer endpoint: IdentityServer4.Endpoints.DiscoveryEndpoint for /.well-known/openid-configuration
info: IdentityServer4.Hosting.IdentityServerMiddleware[0]
      Invoking IdentityServer endpoint: IdentityServer4.Endpoints.TokenEndpoint for /connect/token
info: IdentityServer4.Events.DefaultEventService[0]
      
        "Name": "Client Authentication Failure",
        "Category": "Authentication",
        "EventType": "Failure",
        "Id": 1011,
        "ClientId": "Local",
        "Message": "Invalid client secret",
        "ActivityId": "0HLVQDNPJELVT:00000015",
        "TimeStamp": "2020-05-17T14:26:15Z",
        "ProcessId": 11600,
        "LocalIpAddress": "::1:5001",
        "RemoteIpAddress": "::1"
      
fail: IdentityServer4.Validation.ClientSecretValidator[0]
      Client secret validation failed for client: Local.

在https://localhost:5001/connect/token 上收到 400 个错误请求

Content-Type: application/x-www-form-urlencoded

表格数据

client_id: Local
code: Pu5XVqWcaOavZYWOJqy07gHU7WYJ3aCQ_NBkpzszLnA
redirect_uri: https%3A%2F%2Flocalhost%3A5001%2Fauth-callback
code_verifier: 7985598b08fe49c49c37e3ef9e909295aeacc16b1b904e8990d7438cc60edb377bd31ee6d466489bbde9c75170470048
grant_type: authorization_code

【问题讨论】:

【参考方案1】:

对于像 React 这样的基于 javascript 的单页应用程序 (SPA),您根本不使用客户端密钥。这是因为不能信任这些基于浏览器的应用程序来安全地保密。 SPA 的推荐方式是使用 PKCE 的授权代码流(非隐式)。你应该考虑实现它。

编辑:为此,您需要在客户端设置中设置 RequireClientSecret = false 和 RequirePkce = true。

【讨论】:

我删除了秘密,但仍然是同样的问题。我使用了错误的授权类型 AllowedGrantTypes = GrantTypes.Code, @SanJaisy 您还需要在客户端设置中将 RequireClientSecret 设置为 false。无论如何,您应该寻求实施 PKCE。 谢谢你为我工作。我必须添加 RequireClientSecret = false 和 RequirePkce = true @LalitaCode 感谢您的回答。我遇到了完全相同的问题,因为我遗漏了 RequireClientSecret。在您的评论中看到它并解决了问题。也许考虑将那一点信息移到您的答案中? @AndyN 谢谢提醒。我已经编辑了我的答案。

以上是关于客户端的客户端密码验证失败,授权代码流中的客户端密码无效的主要内容,如果未能解决你的问题,请参考以下文章

IdentityServer4 如何在授权代码流中存储和更新令牌

Oauth2 - 客户端凭证流中的长寿命令牌与重新身份验证

SOA:Rails 多个客户端的用户身份验证和 api 授权

如何使用Outlook 客户端配置其他邮箱客户端收发邮件

使用哪种授权类型来验证第三方客户端的 API 访问权限?

API 设计 - 客户端请求中的可选正文 - 验证失败时返回的状态码