반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
05-18 06:40
관리 메뉴

ImJay

[Java Spring] 오픈 Notion API 를 만들어보자. 본문

개인 프로젝트

[Java Spring] 오픈 Notion API 를 만들어보자.

ImJay 2023. 4. 5. 10:07
반응형

보통 Notion Api 권한을 가져오는 것은 클라이언트에서 수행합니다.

그러나 제가 현재 진행 중인 프로젝트에서는 서버의 데이터를 가공하여 노션에 활용해야 하기 때문에,

서버에서 계정 권한부터 글 작성까지 한번에 수행하기로 결정했습니다.

 

처음에는 프라이빗을 통해 노션에 글 작성까지 성공했었습니다.

테스트를 마치면서 다음 과정으로 서비스를 위해서는 사용자 계정에서 노션 접속이 필요했고, 이를 위해 오픈 API 계정이 필요했습니다.

Notion 오픈 API 계정에 관한 정보가 너무 부족하여 이 글이 도움이 됐으면 하는 바람으로 글을 작성합니다!

 

 

1. 나의 노션 API 에 접속

 

내 위키, 문서, 프로젝트를 모두 한 곳에

사용하는 모든 업무 앱을 Notion 하나에 담아 팀원들과 함께하는 올인원 워크스페이스를 꾸려 보세요.

www.notion.so

 

2. 새 API 통합 만들기 버튼 클릭

 

3. 각자의 설정에 맞게 정보를 입력하고, 제출 버튼을 클릭합니다.

 

4. 배포 버튼을 클릭하고, API 통합을 공개로 활성화해주면, 새롭게 입력해야되는 정보들이 나옵니다.

 

5. 조직정보, uri 는 임시로 입력해줍니다.

 

6. 생성된 OAuth 클라이언트 ID 와 시크릿을 확인할 수 있습니다.

 

11. 여기서 테스트를 위한 페이지가 필요합니다.

간단한 테스트 페이지를 만들었습니다.

당연히 응답을 보기위해 로컬로 띄우셔야 합니다.

 

12. 배포 > OAuth 도메인과 URI

리다이렉션 URI 를 등록해줍니다.

저는 로컬에서 테스트하기 때문에 localhost/notionApiTest 로 등록했습니다.

 

13. 노션 API 작동 원리 파악하기

 

Authorization

This guide describes the authorization flows for internal and public Notion integrations.

developers.notion.com

 

노션 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 사용 방법에 대해 작성했습니다!

 

해당 코드는 저의 환경에서 진행된 내용이므로 막히는 과정이 있으시면 댓글 부탁드립니다!

반응형
Comments