【问题标题】:How do I enable multiple client ids in a Spring Boot OAuth2 Server?如何在 Spring Boot OAuth2 服务器中启用多个客户端 ID?
【发布时间】:2019-02-26 03:46:28
【问题描述】:

我有 Spring Boot OAuth2 服务器工作,但现在我们需要区分来自不同部门的不同客户端,并根据部门提供不同的功能。我想我可以通过客户 ID 将其分开。本指南展示了如何使用单个客户端 ID 设置 OAuth2 服务器,但是如何使用多个客户端 ID 设置它?

https://spring.io/guides/tutorials/spring-boot-oauth2/#_social_login_authserver

然后,当一个 API 请求发出时,我如何找出它是哪个客户端 ID?

【问题讨论】:

    标签: spring spring-boot spring-security-oauth2 spring-oauth2


    【解决方案1】:

    您可以在表 oauth_client_details 中使用不同的 client_id 和 client_secret 组合创建多个条目。 client_secret 显然会被加密。

    现在要生成刷新和访问令牌,点击 url /oauth/tokenAuthorization : Basic base64-encoded,

    base64 编码将是 client_id:client_secret 的 Base64 加密。 请记住,这里的 client_secret 应该是原始的明文密码(未加密)。

    使用 Spring xml 配置(以旧方式)可以实现同样的事情

    <oauth:client client-id="mobile_ios"
            authorized-grant-types="password,refresh_token,implicit" secret="ios_s3cret"
            authorities="ROLE_CLIENT" 
            refresh-token-validity="7776000"
            access-token-validity="300" />
    
        <oauth:client client-id="mobile_android"
            authorized-grant-types="password,refresh_token,implicit" secret="android_s3cret"
            authorities="ROLE_CLIENT"
            refresh-token-validity="7776000"
            access-token-validity="300" />
    
        <oauth:client client-id="web_app"
            authorized-grant-types="password,refresh_token,implicit" secret="web_s3cret"
            authorities="ROLE_CLIENT" 
            refresh-token-validity="7776000"
            access-token-validity="30000" />
    </oauth:client-details-service>
    

    【讨论】:

      【解决方案2】:

      您需要的是如下所示的动态客户端注册:

      https://www.baeldung.com/spring-security-oauth-dynamic-client-registration

      【讨论】:

      • 我设置了 2 个静态客户端。我可以这样做吗? clients.jdbc(dataSource).withClient(applicationName)....and().withClient(applicationName+"-sales")
      • 不,我做不到。它需要oauth_client_details 表,并会尝试将两行插入到数据库中,下次运行时,它会尝试重新插入它们,从而导致重复键违规。谁知道它将客户端 ID 插入数据库?我认为它只会将它们(客户端 ID/秘密)存储在内存中,但将令牌存储在数据库中。然后我将java.security.Principal 注入到请求签名中,然后我就有了请求的客户端ID。
      • 我不明白为什么这是公认的答案。
      猜你喜欢
      • 2016-06-27
      • 1970-01-01
      • 2018-08-22
      • 2015-11-10
      • 2016-09-28
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多