Базовый образец (предпочтительно Java) для API Desire2Learn - PullRequest
0 голосов
/ 23 января 2012

Я посетил и прочитал все страницы Valence и, в частности, REST API.У меня уже есть один одобренный ключ и второй ключ, который еще не был утвержден D2L, и неясно, как я запрашиваю это утверждение.

Документация содержит много информации, но трудно поставить всекусочки вместе.Например, чтобы сделать любой вызов API REST, мне нужно добавить несколько параметров в конец вызова.Параметры задокументированы в одном месте, но в некоторых случаях неясно, как их построить (например, один из ключей должен содержать URL, метку времени и тип выполняемого вызова, но как они должныбыть соединенным?).Затем они должны быть подписаны, и документация, в которой рассказывается, как подписывать ключи, находится на совершенно другой странице, на которую даже не ссылается страница, которая говорит вам, что вы должны подписать параметры.Вдобавок ко всему, документация не очень ясна о том, как сделать подписание, и не предлагает никаких дополнительных объяснений или примеров.Таким образом, чтобы добраться куда угодно, нам приходится много перебирать документацию и проходить через много проб и ошибок.Похоже, что документация предполагает, что читатель имеет опыт в нескольких областях, что может быть или не быть правдой.

Примеры кода будут иметь огромное значение.

1 Ответ

1 голос
/ 23 января 2012

Сэмплов пока не много; мы работаем над тем, чтобы добавить больше и сделать те, которые присутствуют, более очевидными. В качестве одного примера можно привести Java-приложение для Android , которое имеет все средства аутентификации и некоторые базовые вызовы (включая вызов whoami, который является отличным тестовым вызовом).

Также доступны определенные связанные с аутентификацией файлы . Из класса D2LSigner вы можете увидеть алгоритм подписи, который мы используем:

Mac hmacSha256 = Mac.getInstance("hmacSHA256");
byte[] keyBytes = key.getBytes("UTF-8");                 
Key k = new SecretKeySpec(keyBytes, "hmacSHA256");

hmacSha256.init(k);

byte[] dataBytes = data.getBytes("UTF-8");
byte[] sig = hmacSha256.doFinal(dataBytes)

String sigString = base64Url( sig );

Из D2LOperationSecurityImpl вы можете увидеть, как строка запроса совмещается:

//uppercase METHOD, lowercase PATH, timestamp as string 
private static /*final*/ String BASE_STRING_TEMPLATE = "{0}&{1}&{2}"; 

private static /*final*/ String APP_ID_QUERY_NAME = "x_a";
private static /*final*/ String APP_SIG_QUERY_NAME = "x_c";
private static /*final*/ String USER_ID_QUERY_NAME = "x_b";
private static /*final*/ String USER_SIG_QUERY_NAME = "x_d";
private static /*final*/ String TIMESTAMP_QUERY_NAME = "x_t";

...

@Override
public Uri createAuthenticatedUri(String path, String httpMethod) {

    long timestamp = System.currentTimeMillis() +
                     mServerSkewCorrectionMillis.longValue();

    Long timestampObjectSeconds = new Long(timestamp/1000);
    Object[]formatParms = {httpMethod.toUpperCase(),
                           path.toLowerCase(),
                           timestampObjectSeconds.toString()};

    String signatureBaseString = MessageFormat.format(BASE_STRING_TEMPLATE,
                                                      formatParms); 

    String appSig = D2LSigner.base64URLSig(mAppKey, signatureBaseString);
    String userSig = D2LSigner.base64URLSig(mUserKey, signatureBaseString);

    if ((appSig == null) || (userSig == null)) {
        return null;
    }

    String scheme = mEncryptOperations?ENCRYPED_SCHEME:PLAIN_SCHEME;
    Uri.Builder b  = new Uri.Builder();

    b.scheme(scheme);
    b.authority(mHostName);
    b.path(path);
    b.appendQueryParameter(APP_ID_QUERY_NAME, mAppID);
    b.appendQueryParameter(APP_SIG_QUERY_NAME, appSig);
    b.appendQueryParameter(USER_ID_QUERY_NAME, mUserID);
    b.appendQueryParameter(USER_SIG_QUERY_NAME, userSig);
    b.appendQueryParameter(TIMESTAMP_QUERY_NAME, timestampObjectSeconds.toString());

    Uri securedURI = b.build();

    return securedURI;
}

Кроме того, вам необходимо подписать первый URL-адрес, который вы используете для входа, но только с помощью ключа приложения (поскольку вы еще не установили пользовательский контекст). Он использует другую базовую строку (для защиты URL, который используется во время аутентификации):

String signature = D2LSigner.base64URLSig(mAppKey, resultURLString);
BasicNameValuePair appID = new BasicNameValuePair(APP_ID_NAME, mAppID);
BasicNameValuePair appSig = new BasicNameValuePair(APP_SIG_NAME, signature);
BasicNameValuePair callbackURL = new BasicNameValuePair(CALLBACK_NAME, resultURLString);
...