0

私はすべてのValence、特にRESTAPIのページにアクセスして読みました。1つの承認済みキーとD2Lによってまだ承認されていない2つ目のキーがありますが、その承認をどのように要求するかが明確ではありません。

ドキュメントには多くの情報が含まれていますが、すべてをまとめることは困難です。たとえば、REST API呼び出しを行うには、呼び出しの最後にいくつかのパラメーターを追加する必要があります。パラメータは1つの場所に文書化されていますが、パラメータの作成方法が明確でない場合があります(たとえば、キーの1つは、URL、タイムスタンプ、および行われる呼び出しのタイプを含むことですが、どのように行うのですか?連結されますか?)。次に、それらに署名する必要があります。キーに署名する方法を説明するドキュメントは、パラメーターに署名する必要があることを説明するページからも参照されていない、まったく異なるページにあります。その上、ドキュメントは署名の方法について非常に明確ではなく、それ以上の説明や例を提供していません。だからどこにでも行くには、ドキュメントを何度も飛び回って、試行錯誤を繰り返す必要があります。ドキュメントは、読者がいくつかの分野の専門知識を持っていることを前提としているようですが、それは真実である場合とそうでない場合があります。

コード例は大きな違いを生むでしょう。

4

1 に答える 1

1

まだ多くのサンプルはありません。さらに追加し、存在するものをより明確にするために取り組んでいます。一例として、すべての認証機能といくつかの基本的な呼び出し(優れたテスト呼び出しである「whoami」の呼び出しを含む)を備えたJavaAndroidアプリがあります。

特定の認証関連ファイルも利用できます。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);
于 2012-01-23T19:12:25.930 に答える