spring-security - 如何在 Spring Security 中动态指定 OAuth2 资源详细信息?

标签 spring-security oauth shopify spring-security-oauth2

我正在创建一个与 Shopify 的 API 集成的应用程序,它使用 OAuth2 进行身份验证和授权。使用 the tutorial for Spring Security OAuth2 , 和 the tutorial for Shopify ,我已经能够与一家商店进行集成。 YAML 配置如下所示:

shopify:
  shop: myshop
  scopes: read_customers,read_orders
security:
  oauth2:
    client:
      clientId: myclientid
      clientSecret: mysecret
      tokenName: access_token
      authenticationScheme: query
      clientAuthenticationScheme: form
      accessTokenUri: https://${shopify.shop}.myshopify.com/admin/oauth/access_token
      userAuthorizationUri: https://${shopify.shop}.myshopify.com/admin/oauth/authorize?scope=${shopify.scopes}&grant_options[]=
      pre-established-redirect-uri: https://myapp/login
      registered-redirect-uri: https://myapp/login
      use-current-uri: false
    resource:
      userInfoUri: https://${shopify.shop}.myshopify.com/admin/shop.json

但是,此静态配置不适用于在 Shopify 的 App Store 中发布的应用,因为重定向、访问 token 、用户信息和用户授权 URI 取决于商店名称。 There are examples of using more than one provider ,但它们仍然必须是静态的。

为了让这些 URI 是动态的,我想出了几个可能的选项:
  • 使用 /login 中的参数标识商店的路径,然后创建一个过滤器,将商店名称添加到 ThreadLocal在其他一切之前运行,然后动态创建 AuthorizationCodeResourceDetails OAuth2 过滤器需要通过 Spring 代理的工厂 bean。
  • 使用一种动态重新创建 OAuth2ClientAuthenticationProcessingFilter 的“元过滤器”每个请求以及它需要的所有资源。
  • 覆盖 OAuth2ClientAuthenticationProcessingFilter以便它可以处理重新创建 RestTemplate它需要获取访问 token 。

  • 所有这些选项似乎都非常困难。在 Spring Security OAuth2 中处理动态生成的 URI 的访问 token 和用户信息的好方法是什么?

    另外,由于我通常不熟悉 OAuth2,我是否需要在 Spring 配置中启用资源服务器以使用访问 token 保护我的应用程序?

    最佳答案

    有点晚了,但我确实通过覆盖 Oauth2ProtectedResource 的 getter 返回了 oauth 资源的动态 url

        @Bean(name = "googleOauthResource")
    public BaseOAuth2ProtectedResourceDetails getGoogleOauthResource() {
        final AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails() {
            @Override
            public String getPreEstablishedRedirectUri() {
                final RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
                if (requestAttributes instanceof ServletRequestAttributes) {
                    final HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
                    return request.getRequestURL() + "?" + request.getQueryString() + "&addStuff";
                }
    
                return super.getPreEstablishedRedirectUri();
            }
        };
        details.setId("google-oauth-client");
        details.setClientId("xxxxxxxxxxx");
        details.setClientSecret("xxxxxxxx");
        details.setAccessTokenUri("https://www.googleapis.com/oauth2/v4/token");
        details.setUserAuthorizationUri("https://accounts.google.com/o/oauth2/v2/auth");
        details.setTokenName("authorization_code");
        details.setScope(Arrays.asList("https://mail.google.com/,https://www.googleapis.com/auth/gmail.modify"));
        details.setPreEstablishedRedirectUri("http://localhost:8080/xxx-api-web/v2/gmail"); //TODO
        details.setUseCurrentUri(false);
        details.setAuthenticationScheme(AuthenticationScheme.query);
        details.setClientAuthenticationScheme(AuthenticationScheme.form);
        details.setGrantType("authorization_code");
        return details;
    }
    

    关于spring-security - 如何在 Spring Security 中动态指定 OAuth2 资源详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43827696/

    相关文章:

    java - 访问当前用户,在 spring Controller 中,getAuthentication() 返回 null

    Spring 安全: Multiple OpenID Connect Clients for Different Paths?

    Android - 在 HttpsURLConnection 中传递 OAuth1

    javascript - 为什么客户端认证不好?

    oauth - MSN/Hotmail 是否支持 OAuth?

    python - Shopify Python API 和纺织品库存

    grails - grails 4 sessionRegistry空

    java - 支持 Spring Security 身份验证和通过 Spring Social 登录 Linkedin

    shopify - 使用 Shopify 在购物车中添加产品

    node.js - 如何在 Node.JS 中点击 url 后逐行读取 JSONL?