최근 SSO를 사용하여 기존 사용자를 Discourse로 동기화해야 하는 요구 사항이 있었습니다.
따라서, 공식 PHP 구현 문서(Sync DiscourseConnect user data with the sync_sso route - developers - Discourse Meta)를 참고하여 Java 기반 구현을 작성했습니다.
구현 방법은 간단하지만, Apache commons codec과 Okhttp와 같은 몇 가지 추가 패키지가 필요합니다.
Apache commons codec은 디지털 서명을 생성하는 데 사용되고, Okhttp는 HTTP POST 요청을 보내는 데 사용됩니다.
관련 파라미터 설정
다음의 4가지 파라미터를 사전에 가져와야 합니다.
아래 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 문자열을 얻은 후에는 다음 2가지 단계를 수행해야 합니다.
첫 번째 단계는 얻은 URL을 Base64로 변환하는 것입니다.
두 번째 단계는 성공적으로 변환된 Base64 문자열에 디지털 서명을 하는 것입니다. 서명에는 HMAC_SHA_256 알고리즘이 사용되었습니다.
동시에 첫 번째 단계에서 키를 얻어야 하며, 이는 알고리즘과 결합되어 계산에 사용되어야 합니다.
String sso= "admin/users/sync_sso";
String sig= new HmacUtils(HmacAlgorithms.HMAC_SHA_256, "55619458534897").hmacHex(ssoPayload);
위 2가지 값을 얻은 후, JSON 데이터 구조를 다시 구성합니다.
아래와 같은 데이터 구조와 유사하게, 이를 POST 파라미터 데이터로 사용합니다:
{
"sso": "P2V4dGVybmFsX2lkPTEmZW1haWw9aW5mbyU0MHZpc2Fmbi5jb20mdXNlcm5hbWU9aW5mby52aXNhZm4mcmVxdWlyZV9hY3RpdmF0aW9uPXRydWU=",
"sig": "403a205a004e37ffab2bf77cc12b2eac352d71820983706d86984eec9821a0c4"
}
POST 요청 전송
HTTP를 지원하는 어떤 도구를 사용해도 됩니다.
현재 Java에서는 OkHttp를 많이 사용하므로, 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 데이터 동기화 호출을 완료할 수 있습니다.