일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- C
- 플러터 개발환경 설정
- php 프로그래밍 입문 3판
- 페이코 친구코드
- 배열
- 자바
- spring
- 페이코 추천인코드
- 자바 스프링
- 페이코 초대코드
- 플러터
- programmers
- php 프로그래밍 입문
- 한정 분기
- SWEA
- 스프링
- 최단 경로
- php
- php 프로그래밍 입문 연습문제
- 페이코 추천인
- C언어
- Java
- php 프로그래밍 입문 예제
- php 프로그래밍 입문 문제풀이
- Flutter
- JAVA SPRING
- php 프로그래밍
- 백준
- php 프로그래밍 입문 솔루션
- 파이썬
- Today
- Total
ImJay
[Java Spring] 오픈 Notion API 를 만들어보자. 본문
보통 Notion Api 권한을 가져오는 것은 클라이언트에서 수행합니다.
그러나 제가 현재 진행 중인 프로젝트에서는 서버의 데이터를 가공하여 노션에 활용해야 하기 때문에,
서버에서 계정 권한부터 글 작성까지 한번에 수행하기로 결정했습니다.
처음에는 프라이빗을 통해 노션에 글 작성까지 성공했었습니다.
테스트를 마치면서 다음 과정으로 서비스를 위해서는 사용자 계정에서 노션 접속이 필요했고, 이를 위해 오픈 API 계정이 필요했습니다.
Notion 오픈 API 계정에 관한 정보가 너무 부족하여 이 글이 도움이 됐으면 하는 바람으로 글을 작성합니다!
1. 나의 노션 API 에 접속
2. 새 API 통합 만들기 버튼 클릭
3. 각자의 설정에 맞게 정보를 입력하고, 제출 버튼을 클릭합니다.
4. 배포 버튼을 클릭하고, API 통합을 공개로 활성화해주면, 새롭게 입력해야되는 정보들이 나옵니다.
5. 조직정보, uri 는 임시로 입력해줍니다.
6. 생성된 OAuth 클라이언트 ID 와 시크릿을 확인할 수 있습니다.
11. 여기서 테스트를 위한 페이지가 필요합니다.
간단한 테스트 페이지를 만들었습니다.
당연히 응답을 보기위해 로컬로 띄우셔야 합니다.
12. 배포 > OAuth 도메인과 URI
리다이렉션 URI 를 등록해줍니다.
저는 로컬에서 테스트하기 때문에 localhost/notionApiTest 로 등록했습니다.
13. 노션 API 작동 원리 파악하기
노션 API 문서를 공부해왔습니다. 간단히 요약해보면,
13-1. 사용자가 노션 인증 URL 에 접속하기
13-2. 사용자가 페이지 선택을 마치고 액세스 허용 버튼을 클릭하면, 우리가 입력했던 리다이렉션 URI 로 이동하게 됩니다.
code 와 함께 반환합니다. 예를 들어,
localhost:32929/notionApiTest?code=036ca5f5...
여기서 얻어온 code 를 사용해 우리는 사용자 노션 계정의 액세스 토큰을 얻어와야 합니다.
13-3. 액세스 토큰 얻어오기
우리는 Notion API 에게 앞선 과정에서 얻어온 값들을 json 형태로 전송하여 액세스 토큰과 사용자 정보를 반환 받습니다.
13-4. 해당 토큰을 활용하여 사용자 계정으로부터 여러가지 활동을 진행할 수 있습니다.
14. 코드
package ParkLab.VMap.controller.notion;
import ParkLab.VMap.model.Service.notion.TokenRequester;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.http.*;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.client.RestTemplate;
import java.util.Map;
@Controller
public class NotionAuthController {
private static final String callBackUrl = "http://localhost:32929/notionApiTest"; // redirection url 을 입력해주세요
private static final String clientId = "abcd";//clientId 를 입력해주세요
private static final String authorizeUrl = "https://api.notion.com/v1/oauth/authorize";
private static final String clientPw = "secret_asdf";//clientPw 를 입력해주세요
// 인증 url 을 생성해주는 메소드
private static String getAuthGrantType(String callbackURL) {
return authorizeUrl + "?response_type=code&client_id=" + clientId + "&redirect_uri=" + callbackURL;
}
//노션 인증 URL 접속(생략 가능)
@GetMapping("/notionAuth")
public static String Test(){
String authGrantType = getAuthGrantType(callBackUrl);
return "redirect:" + authGrantType;
}
//리다이렉션 url로부터 code를 받아와 json 을 요청하여 액세스토큰을 받는 메소드
@GetMapping("/notionApiTest")
public String handleCallback(@RequestParam("code") String code) throws JsonProcessingException {
// Do something with the code
System.out.println("Authorization Code: " + code);
TokenRequester requester = new TokenRequester(clientId, clientPw);
requester.addParameter("grant_type", "authorization_code");
requester.addParameter("code", code);
requester.addParameter("redirect_uri", callbackUrl);
String response = requester.requestToken("https://api.notion.com/v1/oauth/token");
System.out.println(response);
Map<String, Object> jsonMap = new ObjectMapper().readValue(response, new TypeReference<Map<String, Object>>() {});
String accessToken = (String) jsonMap.get("access_token");
System.out.println("Access Token: " + accessToken);
// Redirect to another page
return "success";
}
}
package ParkLab.VMap.model.Service.notion;
import org.springframework.http.*;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
// request token을 생성해주는 클래스
public class TokenRequester {
private final RestTemplate restTemplate;
private final HttpHeaders headers;
private final MultiValueMap<String, String> requestBody;
public TokenRequester(String clientId, String clientSecret) {
restTemplate = new RestTemplate();
headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.setBasicAuth(clientId, clientSecret); // Basic 인증 헤더 설정
requestBody = new LinkedMultiValueMap<>();
}
public void addParameter(String key, String value) {
requestBody.add(key, value);
}
public String requestToken(String endpoint) {
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(requestBody, headers);
ResponseEntity<String> responseEntity = restTemplate.exchange(endpoint, HttpMethod.POST, requestEntity, String.class);
return responseEntity.getBody();
}
}
14-1. localhost:32929/notionAuth 에 접속하면 자동으로 생성된 노션 인증 URL을 통해 인증 페이지에 접속하고,
14-2. 액세스 허용 버튼을 누르면
code와 access token 이 콘솔에 출력되도록 작성하였습니다.
15. 이제 이렇게 받아온 access_token 과 정보들을 바탕으로 database id 를 받아와 글 작성을 진행하실 수 있습니다.
노션 api 로 글 작성 하는 방법은 프라이빗으로 다양한 블로그에 설명되어 있기 때문에 생략하였습니다.
해당 글은 본인의 노션 계정이 아닌, 타인의 노션계정을 사용하여 여러가지 활동을 진행할 수 있도록 하기 위해
노션 오픈 통합 API 사용 방법에 대해 작성했습니다!
해당 코드는 저의 환경에서 진행된 내용이므로 막히는 과정이 있으시면 댓글 부탁드립니다!
'개인 프로젝트' 카테고리의 다른 글
[HTTP] okhttp WARN 30659 (0) | 2023.05.29 |
---|---|
[Java Spring] Notion API 페이지 블록 추가 (Append block children) (2) | 2023.04.28 |
[VMap] 기능 추가, 코드 리팩토링, 버그 수정, (0) | 2023.03.23 |
[VMap] Linux Ubuntu 환경에서 '모니터 지원 주파수 범위 초과' 문제를 해결해보자. (0) | 2023.03.22 |
[VMap] 자체 서버를 구축해보자 (2) (0) | 2023.03.22 |