首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Security中动态指定OAuth2资源详细信息?

如何在Security中动态指定OAuth2资源详细信息?
EN

Stack Overflow用户
提问于 2017-05-07 04:04:15
回答 2查看 4.2K关注 0票数 5

我正在创建一个与Shopify的API集成的应用程序,该API使用OAuth2进行身份验证和授权。通过使用Spring安全OAuth2教程Shopify教程,我已经能够与单个商店进行集成。YAML配置如下所示:

代码语言:javascript
运行
复制
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中发布的应用程序,因为重定向、访问令牌、用户信息和用户授权URI取决于商店名称。有使用多个提供程序的示例。,但它们仍然必须是静态的。

为了允许这些URI是动态的,我提出了一些可能的选项:

  1. /login路径中使用一个参数来标识商店,然后创建一个过滤器,该过滤器将商店名添加到运行在其他所有内容之前的ThreadLocal中,然后通过Spring代理工厂bean动态创建OAuth2过滤器所需的AuthorizationCodeResourceDetails
  2. 使用一种"metafilter“,它会动态地重新创建每个请求的OAuth2ClientAuthenticationProcessingFilter及其所需的所有资源。
  3. 重写OAuth2ClientAuthenticationProcessingFilter,以便它能够处理重新创建获取访问令牌所需的RestTemplate

所有这些选择似乎都相当困难。在Security OAuth2中处理动态生成的URI以访问令牌和用户信息的好方法是什么?

此外,由于我一般都是OAuth2新手,是否需要在Spring配置中启用资源服务器来使用访问令牌来保护我的应用程序?

EN

回答 2

Stack Overflow用户

发布于 2017-08-21 11:17:31

有点晚了,但我通过重写Oauth2ProtectedResource的getter返回了oauth资源的动态url

代码语言:javascript
运行
复制
    @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;
}
票数 2
EN

Stack Overflow用户

发布于 2017-11-21 23:20:09

我也遇到了同样的问题,我倾向于您使用ThreadLocal存储的第一个理论。下面是我可能要解决的方法:

通过重写ServletRequest中的OAuth2ClientAuthenticationProcessingFilter方法,在LocalThread存储中设置来自OAuth2ClientAuthenticationProcessingFilter的值:

  • attemptAuthentication
  • successfulAuthentication
  • unsuccessfulAuthentication
  • requiresAuthentication

然后,通过重写下面的OAuth2RestTemplate方法来转换URI中的URI:

  • createRequest
  • doExecute
  • appendQueryParameter

我可能不得不为RestTemplate制作我自己的@Bean,它有一个可以查找动态Shopify域的注入@服务。

如果我的解决方案有效的话,我会发出去的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43827696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档