- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 IMS 模拟器 ( http://ltiapps.net/test/tc.php ) 中,单击“保存数据”时,将使用自动填充的数据生成 outh_signature 并将其作为隐藏值以 frmLaunch(name='frmLaunch') 形式放入。我需要以编程方式生成类似的 outh_signature,但即使我使用相同的 oauth_nounce 和 oauth_timestamp ,我也无法生成模拟器生成的确切 oauth_signature 。我不确定生成时需要发送的请求正文是什么签名..
要重新创建场景,请按照以下步骤操作
保存数据后,您将看到一个 outh_signature 隐藏值,其输入 ID 为“oauth_signature”
我尝试通过以下方式生成,但无法获得预期的签名。
import java.io.*;
import java.net.URL;
import java.net.URLEncoder;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.net.ssl.HttpsURLConnection;
// Apache Commons Libraries used for the Nonce & Base64
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
public class OAuthTest {
public static void main(final String[] args) throws Exception
{
// Setup the variables necessary to create the OAuth 1.0 signature and make the request
String httpMethod = "POST";
String consumerKey = "jisc.ac.uk";
String secret = "secret";
String signatureMethod = "HMAC-SHA1";
String body = ""; //mentioned in the description
byte[] requestBody = null;
URL url = new URL("http://ltiapps.net/test/tp.php");
// Set the Nonce and Timestamp parameters
String nonce = "6d95eef168e568a530d1cd419a997952";//getNonce();
String timestamp = "1483470400";//getTimestamp();
System.out.println("Nonce:" + getNonce());
System.out.println("timestamp:" + getTimestamp());
// Set the request body if making a POST or PUT request
if ("POST".equals(httpMethod) || "PUT".equals(httpMethod))
{
requestBody = body.getBytes("UTF-8");
}
// Create the OAuth parameter name/value pair
Map<String, String> oauthParams = new LinkedHashMap<String, String>();
oauthParams.put("oauth_consumer_key", consumerKey);
oauthParams.put("oauth_signature_method", signatureMethod);
oauthParams.put("oauth_timestamp", timestamp);
oauthParams.put("oauth_nonce", nonce);
// Get the OAuth 1.0 Signature
String signature = generateSignature(httpMethod, url, oauthParams, requestBody, secret);
System.out.println(String.format("OAuth 1.0 Signature: %s", signature));
}
private static String getNonce()
{
return RandomStringUtils.randomAlphanumeric(32);
}
private static String getTimestamp()
{
return Long.toString((System.currentTimeMillis() / 1000));
}
private static String generateSignature(
String httpMethod,
URL url,
Map<String, String> oauthParams,
byte[] requestBody,
String secret
) throws UnsupportedEncodingException
{
// Ensure the HTTP Method is upper-cased
httpMethod = httpMethod.toUpperCase();
// Construct the URL-encoded OAuth parameter portion of the signature base string
String encodedParams = normalizeParams(httpMethod, url, oauthParams, requestBody);
// URL-encode the relative URL
String encodedUri = URLEncoder.encode(url.getPath(), "UTF-8");
// Build the signature base string to be signed with the Consumer Secret
String baseString = String.format("%s&%s&%s", httpMethod, encodedUri, encodedParams);
return hmacSha1(baseString, secret);
}
private static String normalizeParams(
String httpMethod,
URL url,
Map<String, String> oauthParams,
byte[] requestBody
) throws UnsupportedEncodingException
{
// Sort the parameters in lexicographical order, 1st by Key then by Value
Map<String, String> kvpParams = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
kvpParams.putAll(oauthParams);
// Place any query string parameters into a key value pair using equals ("=") to mark
// the key/value relationship and join each parameter with an ampersand ("&")
if (url.getQuery() != null)
{
for(String keyValue : url.getQuery().split("&"))
{
String[] p = keyValue.split("=");
kvpParams.put(p[0],p[1]);
}
}
// Include the body parameter if dealing with a POST or PUT request
if ("POST".equals(httpMethod) || "PUT".equals(httpMethod))
{
String body = Base64.encodeBase64String(requestBody).replaceAll("\r\n", "");
// url encode the body 2 times now before combining other params
body = URLEncoder.encode(body, "UTF-8");
body = URLEncoder.encode(body, "UTF-8");
kvpParams.put("body", body);
}
// separate the key and values with a "="
// separate the kvp with a "&"
StringBuilder combinedParams = new StringBuilder();
String delimiter="";
for(String key : kvpParams.keySet()) {
combinedParams.append(delimiter);
combinedParams.append(key);
combinedParams.append("=");
combinedParams.append(kvpParams.get(key));
delimiter="&";
}
// url encode the entire string again before returning
return URLEncoder.encode(combinedParams.toString(), "UTF-8");
}
public static String hmacSha1(String value, String key) {
String algorithm = "HmacSHA1";
try {
// Get an hmac_sha1 key from the raw key bytes
byte[] keyBytes = key.getBytes();
SecretKeySpec signingKey = new SecretKeySpec(keyBytes, algorithm);
// Get an hmac_sha1 Mac instance and initialize with the signing key
Mac mac = Mac.getInstance(algorithm);
mac.init(signingKey);
// Compute the hmac on input data bytes
// byte[] rawHmac = mac.doFinal(value.getBytes());
// Convert raw bytes to Hex
// byte[] hexBytes = new Hex().encode(rawHmac);
return new String(Base64.encodeBase64(mac.doFinal(value.getBytes()))).trim();
// Covert array of Hex bytes to a String
//return new String(hexBytes, "UTF-8");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
pom.xml
<dependencies>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.0</version>
</dependency>
我通过发送如下请求正文尝试了上述程序,并获得了 oauth 签名 0YI3mBg7gmnWaz8YyISG4IoHVQ4= 但预期是 yuuvR1pVDm5xWOYhMtBcBBVTdf8=
你能告诉我我哪里出了问题吗?
最佳答案
由于您使用的是 JAVA,我建议您使用 IMSGlobal 提供的 basiclti-util 库,它会处理您正在做的大部分事情,并且不需要您重新发明轮子
将以下依赖项添加到您的 pom
<dependency>
<groupId>org.imsglobal</groupId>
<artifactId>basiclti-util</artifactId>
<version>1.1.2</version>
</dependency>
该库提供支持:
工具提供商:
工具使用者:
验证工具使用者发送的 LTI 启动请求
HttpServletRequest request; // java servlet request
LtiVerifier ltiVerifier = new LtiOauthVerifier();
String key = request.getParameter("oauth_consumer_key");
String secret = // retrieve corresponding secret for key from db
LtiVerificationResult ltiResult = ltiVerifier.verify(request, secret);
如果您尝试签署传出请求,请使用以下内容
Map<String, String> signedParameters = new LtiOauthSigner().signParameters(parameters, key, secret, url, "POST");
关于java - 无法为我的 IMS LTI 请求生成 oauth_signature,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41451019/
是否可以在java中生成HMACSHA1 oauth_signature,而无需使用signpost库的OAuthConsumer,因此可以轻松地用其他语言实现,例如objective-c 等? 最佳
我正在尝试使用 Coldfusion 9 从 ning 网络获取凭证,所以首先这是测试 api 的 curl 语法: curl -k https://external.ningapis.com/xn/
我正在尝试生成 oauth_signature 以使用 Fatsecret API,但收到无效签名错误 - 无法弄清楚原因。我尝试尽可能准确地遵循 here 中提到的所有步骤(参见步骤 2)来生成签名
在 6.1.1. Consumer Obtains a Request Token 部分OAuth Spec 的一部分说您必须发送包含以下参数的请求: oauth_signature: The
String baseString="POST&"; String subBaseString = "oauth_consumer_key="+oauth_consumer_key+"&oauth_n
在使用 Twitter API 时,我遇到了 oauth_signature,它基本上是(请求正文 + 请求参数 + nonces/timestamps + consumer_secret)的哈希。
我正在尝试在 Swift iOS 应用程序中使用 Yelp API,但我不熟悉加密。我知道我应该使用 SHA1 加密签名,但找不到在 Swift/Xcode 中执行此操作的好资源。 此外,Yelp 文
在 IMS 模拟器 ( http://ltiapps.net/test/tc.php ) 中,单击“保存数据”时,将使用自动填充的数据生成 outh_signature 并将其作为隐藏值以 frmLa
我正在尝试生成用于 Netflix 的 oauth 签名。我一直在关注他们的 API 文档,但当他们到达“If you are using a library, once you have creat
E*Trade API 允许您使用 RESTful 登录网站并操作帐户或检索报价信息。尽管我无法生成与位于底部的“实践问题”相匹配的 oauth_signature https://us.etrade
所以我正在测试 Rest OAuth 实现。我的测试工具将发送 HTTP 请求,但我需要准备授权 header 。 我需要什么我想要一个有效的授权 header 我拥有的:除了 oauth_signa
我正在开发 .net 应用程序以访问我的 tumblr 帐户。 在 ouath 握手中,我正在通过授权步骤。但是,当我尝试获取我的访问 token 时(在我授权我在 tumblr 上的帐户授予我的应用
我正在开发 .net 应用程序以访问我的 tumblr 帐户。 在 ouath 握手中,我正在通过授权步骤。但是,当我尝试获取我的访问 token 时(在我授权我在 tumblr 上的帐户授予我的应用
我使用以下 Autherization 作为 header 调用 Magento API, auth = "OAuth oauth_consumer_key=*********************
我一直在尝试连接到保管箱服务器并使用 api,但我在第一步本身就失败了。当我请求请求 token 时,我在 nodejs 中收到 Bad oauth_signature 错误。 我用来连接 api 的
我正在尝试访问 1.0 版本的 Oauth 网络服务。我可以通过 postman 客户端成功完成这项工作,但无法在安卓应用。 使用的库:-路标-commonshttp4-1.2.1.2.jar API
当我使用像 http://localhost/magento/api/rest/orders/?filter[1][attribute]=entity_id&filter[1][gt]=70&page
我正在尝试访问必须实现 Oauth1 授权的资源。当我使用 postman 并可以选择添加空参数来签名时,它工作正常,但是当我尝试使用 Python 实现相同的功能时,它会抛出错误。 这是我的 pyt
我是一名优秀的程序员,十分优秀!