当前位置: 首页 > 知识库问答 >
问题:

使用第三方身份验证保护资源服务器RESTful API

濮阳俊明
2023-03-14

首先,我有一个用Spring Boot开发的oAuth2授权服务器,注释为@EnableAuthorizationServer和扩展AuthorizationServerConfigrerAdapter。同样,也有一个资源服务器,注释为@EnableResourceServer扩展ResourceServerConfigrerAdapter。

场景:使用谷歌登录的Android应用程序必须以安全的方式调用我的后端REST API,即资源服务器。Android应用程序必须调用REST API来获取记录的用户信息,以便使用授权服务器生成的访问令牌填充应用程序界面。尝试将应用程序与资源和授权服务器以及谷歌登录集成时,我发现了以下谷歌开发者页面:https://developers.google.com/identity/sign-in/web/backend-auth

他们说:

如果将Google登录用于与后端服务器通信的应用程序或网站,则可能需要识别服务器上当前登录的用户。为了安全地执行此操作,在用户成功登录后,使用HTTPS将用户的ID令牌发送到服务器。然后,在服务器上验证ID令牌的完整性,并使用令牌中包含的用户信息建立会话或创建新帐户。

好的,我可以添加一个endpoint来接收ID令牌,没问题。

在同一页的最后,另一个环节也说:

验证令牌后,检查用户是否已在用户数据库中。如果是这样,请为用户建立经过身份验证的会话。如果用户尚未在您的用户数据库中,请根据ID令牌负载中的信息创建新的用户记录,并为用户建立会话。在应用程序中检测到新创建的用户时,您可以提示用户输入所需的任何其他配置文件信息。

我们说到点子上了。在用户登录谷歌时验证Android应用程序发送的ID令牌后,我如何将该应用程序与API集成,并在我的Spring授权服务器上生成访问和刷新令牌,以将其发送到移动应用程序?

共有1个答案

越伟泽
2023-03-14

找到解决方案:我创建了一个自定义的补助金类型。通过这种方式,我可以覆盖身份验证,向提供者(在本例中是谷歌)检查ID令牌,如果可以,让正常流完成它的工作。

我的实施基于:

1) 授权服务器:https://github.com/spring-projects/spring-security-oauth/blob/master/tests/annotation/custom-grant/src/main/java/demo/Application.java

2)自定义令牌授予者:https://github.com/spring-projects/spring-security-oauth/blob/master/tests/annotation/custom-grant/src/main/java/demo/CustomTokenGranter.java:

以下是我在静态编程语言中的自定义实现:

1) 覆盖配置(endpoint:AuthorizationServerEndpointsConfigure)来自AuthorizationServerConfigurerAdapter

override fun configure(endpoints: AuthorizationServerEndpointsConfigurer) {
    endpoints
        .tokenStore(tokenStore)
        .reuseRefreshTokens(false)
        .accessTokenConverter(accessTokenConverter)
        .authenticationManager(authenticationManager)
        .userDetailsService(authUserDetails)
        .tokenGranter(tokenGranter(endpoints))
}

private fun tokenGranter(endpoints: AuthorizationServerEndpointsConfigurer) =
    CompositeTokenGranter(mutableListOf(endpoints.tokenGranter).apply {
        add(GoogleTokenGranter(
                tokenServices = endpoints.tokenServices,
                clientDetailsService = endpoints.clientDetailsService,
                requestFactory = endpoints.oAuth2RequestFactory,
                grantType = GoogleTokenGranter.GRANT_TYPE
            )
        )
    })

2) 自定义令牌授予器实现:

class GoogleTokenGranter internal constructor(
    tokenServices: AuthorizationServerTokenServices,
    clientDetailsService: ClientDetailsService,
    requestFactory: OAuth2RequestFactory,
    grantType: String
) : AbstractTokenGranter(tokenServices, clientDetailsService, requestFactory, grantType) {

    override fun getOAuth2Authentication(client: ClientDetails, tokenRequest: TokenRequest): OAuth2Authentication {

        // check token with google here

        return super.getOAuth2Authentication(client, tokenRequest)
    }

    companion object {
        const val GRANT_TYPE = "google"
    }
}

客户端移动应用程序必须以以下方式发送请求:

POST/oauth/token

有效载荷:

{
  "grant_type": "google"
  "username": "admin"
  "token": "xxxxxxxxxxxxxxxxxxxxx" 
}

别忘了将授权头和客户端凭据一起发送到Spring验证允许的大类型、范围等

 类似资料:
  • 我在我的Web api项目中使用Swagger: 等等。我们也使用SwaggerUI。工作起来像个符咒。对于生产,我们不希望swagger UI可用,我们希望使用基本身份验证来保护它。Afaik没有现成的此类功能。有没有一种方法可以通过网络api中的某种“黑客”来实现这一点?我可以只为特定的路由或类似的东西注册专用筛选器吗? 感谢你的帮助问候劳琳

  • 我在同一台主机上设置了多个eureka服务器实例。它们使用主机名eureka primary、secondary和treative,这些主机名在hosts文件中定义为localhost别名,并且一切正常-它们作为不同的实例彼此可见和可用。 当我尝试使用保护eureka实例时,问题就出现了。其想法是添加Spring Security依赖项,在eureka服务器上指定安全用户和密码,并将这些凭据放入U

  • 如何使用spring oauth2和DB实现资源服务器和身份验证服务器,以及如何使用以下模式:https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/test/resources/schema.sql 测试数据会很棒!!!

  • 我们有一个在Apache和nginx上运行的Angular 8应用程序。我们使用带有和的Basic Auth保护此应用程序。 不幸的是,由于对服务器的请求被基本身份验证阻止,应用程序无法加载,Angular无法加载这些文件: 此 路 不通http://root/polyfills-es2015.js因为这是一个跨来源请求,所以不要求提供凭据 已阻止http://root/runtime-es201

  • 我正在使用Spring OAuth2实现单独的资源和自定义身份验证服务器。我已经通过发出和验证JWT令牌配置了与身份验证服务器的交互,看起来一切都很好。 现在我正在尝试添加SSO功能,但真的坚持了下来。我研究了官方的Spring示例和附带的指南,但是当涉及到将SSO部分与自定义服务器身份验证连接时,它的措辞非常简短。而且实际上作者只使用外部提供程序资源(“user”信息)来显示进程。 我认为这是正

  • 我试图扩展用户身份验证示例,这里也给出了这个示例,以便多个用户可以登录到服务器。我还想为每个用户分配一个不同的主目录。到目前为止,我还没有找到Apache SSHD API提供的任何此类实用程序,因此我尝试了以下解决方案,使用Apache FTPServer提供的实用程序。 我试图做的是: