【发布时间】: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 使用案例...... 对不起,但我没有在网上找到任何例子。 感谢您的任何评论。
【问题讨论】: