كان هناك حاجة مؤخرًا لمزامنة المستخدمين الحاليين مع Discourse باستخدام SSO.
لذلك، بناءً على التنفيذ الرسمي لـ PHP ( مزامنة بيانات مستخدم DiscourseConnect مع المسار sync_sso - المطورون - Discourse Meta )، قمت بإنشاء تطبيق لـ Java.
طريقة التنفيذ بسيطة جدًا، ولكنها تتطلب بعض الحزم الإضافية، وأهمها Apache commons codec و Okhttp.
Apache commons codec يستخدم لإنشاء التوقيع الرقمي، و Okhttp يستخدم لإرسال طلبات Http Post.
إعداد المعلمات ذات الصلة
هناك 4 معلمات تحتاج إلى الحصول عليها مسبقًا.
للحصول على المعلمات الأربع التالية، يرجى الرجوع إلى المقالة: Discourse يستخدم DiscourseConnect لمزامنة بيانات المستخدم
const apiKey = '4fe83002bb5fba8c9a61a65e5b4b0a3cf8233b0e4ccafc85ebd6607abab4651a';
const apiUser = 'system';
const connectSecret = 'jdhb19*Xh3!nu(#k';
إعداد معلمات SSO
تمت الإشارة إلى إعداد المعلمات إلى إعداد معلمات طريقة URL Get.
كود Java الخاص بنا هو:
URIBuilder builder = new URIBuilder();
builder.addParameter("external_id", "1");
builder.addParameter("email", "info@isharkfly.com");
builder.addParameter("username", "info.visafn.sso");
builder.addParameter("add_groups", "bar");
builder.addParameter("require_activation", "false");
url = StringUtils.removeStart(builder.build().toString(),"?");
System.out.println(StringUtils.removeStart(url, "?"));
Base64 والتوقيع الرقمي
بعد الحصول على سلسلة URL أعلاه، لدينا خطوتان أخريان يجب القيام بهما.
الخطوة الأولى هي تحويل URL الذي تم الحصول عليه إلى Base64.
الخطوة الثانية هي التوقيع الرقمي للسلسلة التي تم تحويلها بنجاح إلى Base64، ويتم استخدام خوارزمية HMAC_SHA_256 للتوقيع.
في نفس الوقت، يتم الحصول على المفتاح في الخطوة الأولى، ويجب استخدامه كمعلمة للمشاركة في العملية مع الخوارزمية.
String sso= "admin/users/sync_sso";
String sig= new HmacUtils(HmacAlgorithms.HMAC_SHA_256, "55619458534897").hmacHex(ssoPayload);
بعد الحصول على القيمتين أعلاه، أعد بناء هيكل بيانات Json.
هيكل بيانات مشابه للهيكل التالي، ثم استخدمه كبيانات لمعلمة Post:
{
"sso": "P2V4dGVybmFsX2lkPTEmZW1haWw9aW5mbyU0MHZpc2Fmbi5jb20mdXNlcm5hbWU9aW5mby52aXNhZm4mcmVxdWlyZV9hY3RpdmF0aW9uPXRydWU=",
"sig": "403a205a004e37ffab2bf77cc12b2eac352d71820983706d86984eec9821a0c4"
}
إرسال طلب POST
يمكن استخدام أي أداة تدعم HTTP.
يستخدم OkHttp بشكل شائع في Java الآن، لذلك سنستخدم OkHttp لإرسال الطلب.
private OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(
MediaType.parse("application/json"), objectMapper.writeValueAsString(syncSSO));
Response response = client.newCall(postRequest(path, body)).execute();
postRequest أعلاه هي طريقة، وفي هذه الطريقة نستخدم المعلمات الموجودة لبناء الطلب.
الطريقة مكتوبة على النحو التالي:
public Request postRequest(String path, RequestBody body) {
HttpUrl.Builder urlBuilder = HttpUrl.parse(site_url + path).newBuilder();
Request request = new Request.Builder().url(urlBuilder.build().toString())
.addHeader("api-username", api_username)
.addHeader("api-key", api_key)
.post(body)
.build();
return request;
}
إذا لم تكن هناك مشكلة، يمكن للكود أعلاه إكمال استدعاء مزامنة بيانات SSO.