【问题标题】:Spring OAuth 1.0 support: how to verify OAuth request?Spring OAuth 1.0 支持:如何验证 OAuth 请求?
【发布时间】:2019-05-01 10:50:00
【问题描述】:

我必须支持在单腿场景中向我的服务器发送 OAuth 1.0 POST 请求的旧版 API:

我收到了一个包含一堆 OAuth 参数的请求,我想(首先)使用存储在服务器上的秘密来验证这些参数。

这是我到目前为止所做的(产生异常):

API 发送的参数:

key :: launch_presentation_return_url
value :: 
key :: lti_version
value :: LTI-1p0
key :: user_id
value :: student
key :: roles
value :: Instructor
key :: oauth_nonce
value :: 160455874400102142031543488380
key :: oauth_timestamp
value :: 1543488380
key :: lis_result_sourcedid
value :: course-v1%3Aedx-integration-initiative%2B123456%2B2018_T2:-de03e087e09d4629ab61ee44cea69b43:student
key :: context_id
value :: course-v1:edx-integration-initiative+123456+2018_T2
key :: oauth_consumer_key
value :: the_client_key
key :: resource_link_id
value :: -de03e087e09d4629ab61ee44cea69b43
key :: oauth_signature_method
value :: HMAC-SHA1
key :: oauth_version
value :: 1.0
key :: lis_outcome_service_url
value :: /preview/xblock/block-v1:edx-integration-initiative+123456+2018_T2+type@lti+block@de03e087e09d4629ab61ee44cea69b43/handler/grade_handler
key :: oauth_signature
value :: 9ENcuZRA6akEc+cM753GB+zPzLE=
key :: lti_message_type
value :: basic-lti-launch-request
key :: oauth_callback
value :: about:blank

我的控制器:

@PostMapping("/api/start")
    @ResponseBody
    public String start(HttpServletRequest request) throws Exception {

        String key = request.getParameter("oauth_consumer_key");
        String signature = request.getParameter("oauth_signature");

        // ...code to retrieve secret from DB based on key
        String secret = "my_client_secret";

            // Spring processing
            CoreOAuthProviderSupport providerSupport = new CoreOAuthProviderSupport();
String signatureBaseString = providerSupport.getSignatureBaseString(request);

        SecretKey secretKey = new SecretKeySpec(secret.getBytes(), "AES"); 
        HMAC_SHA1SignatureMethod signatureMethod = new HMAC_SHA1SignatureMethod(secretKey);
        signatureMethod.verify(signatureBaseString, signature);
        System.out.println("Success verification");
        return "Success";
    }

此控制器失败:

org.springframework.security.oauth.common.signature.InvalidSignatureException: 签名方法 HMAC-SHA1 的签名无效

秘密与提供给远程 api 的相同(仔细检查!)。

我怎样才能让它工作? 我觉得我的代码有错误或错误的 API 使用案例...... 对不起,但我没有在网上找到任何例子。 感谢您的任何评论。

【问题讨论】:

    标签: java spring oauth


    【解决方案1】:

    好的,我终于找到了Spring对OAuth 1.0算法的实现。 基本上工作是在OAuthProviderProcessingFilter完成的

    执行它的代码片段如下所示:

      /**
       * Validate the signature of the request given the authentication request.
       *
       * @param authentication The authentication request.
       */
      protected void validateSignature(ConsumerAuthentication authentication) throws AuthenticationException {
        SignatureSecret secret = authentication.getConsumerDetails().getSignatureSecret();
        String token = authentication.getConsumerCredentials().getToken();
        OAuthProviderToken authToken = null;
        if (token != null && !"".equals(token)) {
          authToken = getTokenServices().getToken(token);
        }
    
        String signatureMethod = authentication.getConsumerCredentials().getSignatureMethod();
        OAuthSignatureMethod method;
        try {
          method = getSignatureMethodFactory().getSignatureMethod(signatureMethod, secret, authToken != null ? authToken.getSecret() : null);
        }
        catch (UnsupportedSignatureMethodException e) {
          throw new OAuthException(e.getMessage(), e);
        }
    
        String signatureBaseString = authentication.getConsumerCredentials().getSignatureBaseString();
        String signature = authentication.getConsumerCredentials().getSignature();
        if (log.isDebugEnabled()) {
          log.debug("Verifying signature " + signature + " for signature base string " + signatureBaseString + " with method " + method.getName() + ".");
        }
        method.verify(signatureBaseString, signature);
      }
    

    Spring Boot v2.X 配置看起来与这个非常相似:

    Configuring 0-legged OAuth 1.0 in Spring Boot

    【讨论】:

      猜你喜欢
      • 2010-11-11
      • 2018-01-27
      • 2013-01-25
      • 2018-01-30
      • 2018-04-12
      • 2015-12-29
      • 2021-08-31
      • 2015-04-01
      • 1970-01-01
      相关资源
      最近更新 更多