1. Salesforce API
Salesforce는 SaaS로 서비스를 제공하고 있지만 외부에서 다양한 작업을 수행할 수 있게 API를 제공하고 있다. 이 글에서는 java를 통해 API를 호출하는 방법을 정리하고자 한다.
Salesforce API 공식문서 : https://developer.salesforce.com/docs/apis
2. Salesforce API 이용 순서
Salesforce를 이용하기 위해서는
- OAuth 인증을 통한 Access Token 발급
- 요청 헤더에 Access Token 적재
- 요청 전송
의 과정을 거친다. OAuth 인증 방식도 인가코드(Authorization code)를 발급받는 방식과 password 방식이 있다.
3. Salesforce Access Token 발급
첫번째 단계는 Access Token을 발급받는 과정이다. 위에서 설명한 것처럼 OAuth 인증을 수행해야 하며 인가코드(Authorization code)를 발급받는 방식과 password 방식을 둘다 활용해보도록 하겠다.
3-1. 인가 코드를 이용한 Access Token 발급
먼저 Salesforce에서 인증 및 API 사용 권한을 부여할 애플리케이션이 존재해야한다.
Salesforce에 설정 - 앱 - 앱 관리자로 들어가서 해당 역할을 수행할 애플리케이션을 만든다.
그 다음 인증받은 사람이 API 사용과관련한 모든 권한을 사용할 수 있도록 범위를 지정해주고, 인가 코드를 받을 callback 주소도 같이 설정해준다.
그리고 인증에 필요한 Cunsumer key 와 Secret값도 확인해준다.
필요한 설정은 끝났으니 java 코드를 이용해 인가코드를 발급받는다.
CLIENT_ID = Consumer Key
REDIRECT_URI = callback 주소
private static final String CLIENT_ID = "";
private static final String REDIRECT_URI = "http://localhost:8080";
static String CODE_VERIFIER = "";
static String CODE_CHALLENGE = "";
public static String generateCodeVerifier() {
SecureRandom random = new SecureRandom();
byte[] codeVerifier = new byte[32];
random.nextBytes(codeVerifier);
return Base64.getUrlEncoder().withoutPadding().encodeToString(codeVerifier);
}
public static String generateCodeChallenge(String codeVerifier) throws Exception {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(codeVerifier.getBytes(StandardCharsets.US_ASCII));
return Base64.getUrlEncoder().withoutPadding().encodeToString(hash);
}
public static void getAuthCode() throws Exception {
try {
CODE_VERIFIER = generateCodeVerifier();
CODE_CHALLENGE = generateCodeChallenge(CODE_VERIFIER);
String authUrl = "https://login.salesforce.com/services/oauth2/authorize"
+ "?response_type=code"
+ "&client_id=" + CLIENT_ID
+ "&redirect_uri=" + URLEncoder.encode(REDIRECT_URI, StandardCharsets.UTF_8.name())
+ "&scope=" + URLEncoder.encode("full refresh_token", StandardCharsets.UTF_8.name())
+ "&state=xyz"
+ "&code_challenge=" + CODE_CHALLENGE
+ "&code_challenge_method=S256";
if (Desktop.isDesktopSupported()) {
Desktop.getDesktop().browse(new URI(authUrl));
System.out.println("브라우저가 열렸습니다. Salesforce 로그인 후 승인하면 Authorization Code가 Callback URL에 포함됩니다.");
} else {
System.out.println("Desktop 브라우저를 지원하지 않는 환경입니다. URL을 직접 입력하세요:\n" + authUrl);
}
} catch (Exception e) {
e.printStackTrace();
}
}
해당 작업을 수행하면 인증에 대한 브라우저가 뜨고, 로그인까지 마치면 아래와 같이 callback 주소 뒤에 인가코드가 발급된다.
그러면 이 인가 코드를 이용해 Access Token을 발급 받아야한다. 아래 코드대로 Token URL에 인가코드와 Consumer key, Consumer secret값 등을 적재해서 보내면
private static final String TOKEN_URL = "https://login.salesforce.com/services/oauth2/token";
public static void getAccessToken() throws Exception {
String urlParameters = "grant_type=authorization_code"
+ "&client_id=" + URLEncoder.encode(CLIENT_ID, StandardCharsets.UTF_8.name())
+ "&client_secret=" + URLEncoder.encode(CLIENT_SECRET, StandardCharsets.UTF_8.name())
+ "&redirect_uri=" + URLEncoder.encode(REDIRECT_URI, StandardCharsets.UTF_8.name())
+ "&code=" + URLEncoder.encode(AUTH_CODE, StandardCharsets.UTF_8.name())
+ "&code_verifier=" + CODE_VERIFIER;
URL url = new URL(TOKEN_URL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setDoOutput(true);
try (OutputStream os = conn.getOutputStream()) {
byte[] input = urlParameters.getBytes(StandardCharsets.UTF_8);
os.write(input, 0, input.length);
}
int responseCode = conn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
JSONObject jsonResponse = new JSONObject(response.toString());
String accessToken = jsonResponse.getString("access_token");
System.out.println("Access Token : " + accessToken);
ACCESS_TOKEN = accessToken;
}
} else {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getErrorStream(), StandardCharsets.UTF_8))) {
StringBuilder errorResponse = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
errorResponse.append(line);
}
System.out.println("Error Response: " + errorResponse);
}
}
}
드디어 Access Token이 발급된다.
3-2. API 토큰을 이용한 Access Token 발급
3-1 과정 말고도 password만 가지고 Access Token를 발급 받는 방법도 존재한다. 마찬가지로 인증 및 API 사용 권한을 부여할 애플리케이션이 존재해야 한다.
먼저 사용자 설정에 들어가 보안 토큰을 발급 받는다.
그러면 해당 계정의 메일로 보안토큰이 발급된다.
그리고 grant_type를 password로 consumer key와 consumer secret, username, password+api token을 적재해서 요청을 보낸다.
public static void getAccessToken2() throws Exception {
String urlParameters = "grant_type=password"
+ "&client_id=" + URLEncoder.encode(CLIENT_ID, StandardCharsets.UTF_8.name())
+ "&client_secret=" + URLEncoder.encode(CLIENT_SECRET, StandardCharsets.UTF_8.name())
+ "&username=" + URLEncoder.encode(USERNAME, StandardCharsets.UTF_8.name())
+ "&password=" + URLEncoder.encode(PASSWORD+SECURITY_TOKEN, StandardCharsets.UTF_8.name());
URL url = new URL(TOKEN_URL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setDoOutput(true);
try (OutputStream os = conn.getOutputStream()) {
byte[] input = urlParameters.getBytes(StandardCharsets.UTF_8);
os.write(input, 0, input.length);
}
int responseCode = conn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
JSONObject jsonResponse = new JSONObject(response.toString());
String accessToken = jsonResponse.getString("access_token");
System.out.println("Access Token : " + accessToken);
ACCESS_TOKEN = accessToken;
}
} else {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getErrorStream(), StandardCharsets.UTF_8))) {
StringBuilder errorResponse = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
errorResponse.append(line);
}
System.out.println("Error Response: " + errorResponse);
}
}
}
그럼 똑같이 Access Token이 발급된다.
'기타' 카테고리의 다른 글
[Salesforce] (3/3) Salesforce API 요청 보내기 (0) | 2025.04.22 |
---|---|
[Salesforce] (1/3) Salesforce 란? (1) | 2025.04.11 |