JSP/SERVLET
2020.03.20 / 10:05

½ºÇÁ¸µ ºÎÆ®¿¡¼­ ±¸±Û API ¿¬µ¿ (1) ¼³Á¤ºÎÅÍ Oauth ÀÎÁõ

Äڷγª
Ãßõ ¼ö 262

Spring Boot ApplicationÀ¸·Î ¸¸µç äÆà º¿¿¡ Á¦ ±¸±Û °èÁ¤ÀÇ Calendar¸¦ ¿¬µ¿ÇÏ¿© ½ºÄÉÁÙ ÀÏÁ¤À» º¿À» ÅëÇØ È®ÀÎ °¡´ÉÇϵµ·Ï ±¸ÇöÇغ¸¾Ò½À´Ï´Ù. ´Ù½Ã Çѹø Á¤¸®¸¦ Çϸ砱¸±Û API¸¦ óÀ½ ¿¬µ¿ÇϽô ºÐµé²² µµ¿òÀÌ µÇ¾úÀ¸¸éÇÏ¿© ±ÛÀ» ÀÛ¼ºÇÕ´Ï´Ù!



±¸±Û¿¡¼­ ÇÁ·ÎÁ§Æ® »ý¼º ¹× ¼³Á¤

 ±¸±Û API¸¦ »ç¿ëÇϱâ À§Çؼ­´Â API ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇØ¾ß ÇÕ´Ï´Ù. API ÇÁ·ÎÁ§Æ®´Â ÇØ´ç »ç¿ëÀÚ¿¡°Ô ÇÊ¿äÇÑ Á¤º¸¸¦ ¿äûÇÏ°í »ç¿ëÀÚÀÇ ½ÂÀÎÀ» ÅëÇØ »ç¿ëÀÚÀÇ Á¤º¸¿¡ Á¢±ÙÇϱ⵵ Çϸç, ¼­ºñ½º °èÁ¤À» ÅëÇØ Æ¯Á¤ Å°¸¦ ÅëÇØ API¿¡¼­ Á¦°øÇÏ´Â ±â´ÉÀ» Á¦°øÇϱ⵵ ÇÕ´Ï´Ù. Calendar API´Â »ç¿ëÀÚÀÇ µ¿ÀǸ¦ ÅëÇØ »ç¿ëÀÚ Á¤º¸¿¡ Á¢±ÙÇÏ´Â API ÀÔ´Ï´Ù.


 Ã³À½Àº ÇÁ·ÎÁ§Æ® »ý¼º ÇÕ´Ï´Ù. ±¸±Û API Äֿܼ¡ Á¢¼ÓÇÏ¿© ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇÕ´Ï´Ù. ù ÇÁ·ÎÁ§Æ®¶ó¸é óÀ½ºÎÅÍ »ý¼ºÇÏ´Â È­¸éÀÌ ³ª¿Ã °ÍÀÌ°í, ÀÌ¹Ì ÇÁ·ÎÁ§Æ®°¡ ÀÖ´Ù¸é ¿ìÃø »ó´Ü ÅÇÀ» ÅëÇØ ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇÕ´Ï´Ù. ±âÁ¸ ÇÁ·ÎÁ§Æ®¸¦ »ç¿ëÇصµ µË´Ï´Ù.


 ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇß´Ù¸é °³¿ä ÅÇ¿¡¼­ ¿ì¸®°¡ »ç¿ëÇÒ Calendar API¸¦ »ç¿ë ¼³Á¤ ÇÕ´Ï´Ù! ¾Æ·¡ ¼³¸íÀ» º¸¸é ÀÌ API¸¦ ÅëÇØ »ç¿äÀÚ ÀÎÁõ Á¤º¸ »ç¿ëÀ̶ó´Â ¹®±¸°¡ º¸ÀÔ´Ï´Ù.

´ÙÀ½Àº »ç¿ëÀÚ ÀÎÁõ Á¤º¸ ÀÔ´Ï´Ù.

 

ù ¹ø°. »ç¿ëÀÚ ÀÎÁõ Á¤º¸


 ÇÊ¿äÇÑ »ç¿ëÀÚ ÀÎÁõ Á¤º¸¸¦ »ý¼ºÇϴµ¥ À§ ¼³¸í°ú °°ÀÌ Calendar API´Â Oauth Ŭ¶óÀ̾ðÆ® ID ÀÎÁõ Á¤º¸¸¦ ÇÊ¿ä·Î ÇÕ´Ï´Ù. ±×·¡¼­ »ý¼º!


 


 À§¿Í °°ÀÌ »ç¿ëÀÚ ÀÎÁõ Á¤º¸°¡ »ý¼ºµÇ¾ú½À´Ï´Ù. ¾ÕÀ¸·Î »ç¿ëÀÚ´Â »ý¼ºÇÑ Å¬¶óÀ̾ðÆ® ID¸¦ ÅëÇØ API ÇÁ·ÎÁ§Æ®¿¡ Á¢±ÙÇÒ °Í ÀÔ´Ï´Ù. ¿À¸¥ÂÊ »¡°£ ³×¸ð·Î Ç¥½ÃÇØ³í ¹öÆ°À» Ŭ¸¯Çϸé client_secret.jsonÀ» ´Ù¿î¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù. ÀÌ json´Â ±¸±Û ÀÎÁõ ½Ã ÇÁ·ÎÁ§Æ® ¼­ºñ½º Á¤º¸·Î »ç¿ëÇÏ°Ô µÉ Á¤º¸°¡ ´ã°Ü ÀÖ½À´Ï´Ù! ´Ù¿î·Îµå ¹Þ¾Æ¼­ ÇÁ·ÎÁ§Æ®ÀÇ Àû´çÇÑ °æ·Î¿¡ ¹èÄ¡ÇÕ´Ï´Ù.


µÎ ¹ø°. Oauth µ¿ÀÇ È­¸é


»ç¿ëÀÚ°¡ ÇØ´ç ¼­ºñ½º¿¡ Á¢±ÙÇϱâ À§ÇØ ·Î±×ÀÎÇßÀ» ¶§ »ç¿ëÀÚÀÇ µ¿ÀǸ¦ ±¸ÇÏ´Â È­¸éÀÌ ³ª¿À°Ô µË´Ï´Ù. ±× ¶§ Ç¥½Ã¸é ¼­ºñ½º À̸§°ú °¢Á¾ Á¤º¸µéÀÔ´Ï´Ù! Á¦°¡ ¸¸µé º¿ÀÇ À̸§Àº ¿ïÆ®·ÐÀ̹ǷΠ¿ïÆ®·ÐÀ¸·Î ¼³Á¤Çß½À´Ï´Ù.


¼¼ ¹ø°. µµ¸ÞÀÎ



 ÇØ´ç ¼­ºñ½º·Î Á¢±Ù ÈÄ ÄݹéÀ» ¹ÞÀ» URLÀ» Á¦ÇÑÇÒ ¼ö ÀÖµµ·Ï µµ¸ÞÀÎÀ» ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. callback ÁÖ¼Ò°¡ ¼³Á¤µÈ µµ¸ÞÀÎ ÁÖ¼Ò°¡ ¾Æ´Ò ¶§ Á¢±ÙÀ» Á¦ÇÑÇÕ´Ï´Ù. ÀÌ ¶§ µî·ÏµÉ µµ¸ÞÀÎÀº ¹Ýµå½Ã ¼ÒÀ¯±ÇÀ» °¡Áö°í ÀÖ´Â ÁÖ¼Ò¿©¾ß ÇÕ´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é µî·ÏÀÌ ¾ÈµË´Ï´Ù. Àú´Â ·ÎÄÿ¡¼­ ¸ðµç °ÍÀ» ÇØ°áÇÒ °ÍÀ̹ǷΠÆнº..

 


 ¿©±â±îÁö ¼³Á¤Çß´Ù¸é Calendar API¸¦ »ç¿ëÇϱâ À§ÇÑ Áغñ°¡ ³¡³µ½À´Ï´Ù. ÀÌÁ¦ Spring Boot Project ¼³Á¤À» º¸°Ú½À´Ï´Ù!.




±âº» ¼³Á¤ ºÎºÐÀº ±¸±Û¿¡¼­ Á¦°øÇϴ java quick start¸¦ º¸¼Åµµ µË´Ï´Ù!.


Dependency


 ±¸±Û API »ç¿ëÀ» À§ÇÑ ±¸±Û API ¶óÀ̺귯¸®, oauth ÀÎÁõÀ» À§ÇÑ ¶óÀ̺귯¸®, calendar ¼­ºñ½º¸¦ À§ÇÑ ¶óÀ̺귯¸®¸¦ Ãß°¡Çß½À´Ï´Ù!

1
2
3
compile ('com.google.api-client:google-api-client:1.20.0')
compile ('com.google.oauth-client:google-oauth-client-jetty:1.20.0')
compile ('com.google.apis:google-api-services-calendar:v3-rev125-1.20.0')
cs




AuthUtil


 ´ÙÀ½ÀÌ ¹Ù·Î ±¸±Û Oauth ÀÎÁõÀ» ÅëÇØ Calendar ¼­ºñ½º¸¦ »ý¼ºÇÏ´Â °úÁ¤ÀÔ´Ï´Ù. Àú´Â Calendar ¼­ºñ½º¸¦ »ý¼ºÇÏ´Â °úÁ¤±îÁö¸¦ Util·Î µû·Î ºÐ¸®ÇÏ¿© ÀÛ¼ºÇÏ¿´½À´Ï´Ù.


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
public class AuthCalendarUtil {
    private static final String APPLICATION_NAME = "Google Calendar API Java Quickstart";
 
    private static final java.io.File DATA_STORE_DIR = new java.io.File(
            System.getProperty("user.home"), ".credentials/calendar-ultron.json");
 
    private static FileDataStoreFactory DATA_STORE_FACTORY;
 
    private static final JsonFactory JSON_FACTORY =
            JacksonFactory.getDefaultInstance();    
 
    private static final List<String> SCOPES =
            Arrays.asList(CalendarScopes.CALENDAR_READONLY);

private static HttpTransport HTTP_TRANSPORT;
 
    static {
        try {
            HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
            DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
        } catch (Throwable t) {
            t.printStackTrace();
            System.exit(1);
        }
    }
cs
  • APPLICATION_NAME : ¼­ºñ½ºÀÇ À̸§ÀÌ´Ï ¿øÇÏ´Â À̸§À¸·Î ÀÛ¼ºÇÏ¸é µË´Ï´Ù.

  • DATA_STORE_DIR : DATA_STORE_FACTORY¿¡¼­ ±¸±Û Oauth ÀÎÁõ Á¤º¸°¡ ÀúÀåµÇ´Â °æ·Î¸¦ ¸»ÇÕ´Ï´Ù. À§ÀÇ ¼³Á¤Àº UserÀÇ HOMEÀ¸·Î ÁöÁ¤µÈ µð·ºÅ丮ÀÇ .crdentialsÀ̶õ µð·ºÅ丮¿¡ calendar-ultron.jsonÀ̶õ ÆÄÀÏÀ» ¶æ ÇÕ´Ï´Ù.

  • JSON_FACTORY : client_secret.jsonÀ» ±¸±Û API¿¡ ¸Â°Ô ÆĽÌÇØÁÖ´Â ±¸±Û API ¶óÀ̺귯¸®¿¡ Æ÷ÇÔµÈ JacksonFacotryÀÔ´Ï´Ù. 

  • SCOPES :  ÇØ´ç °èÁ¤¿¡°Ô ¿ä±¸µÇ´Â ±ÇÇÑÀ¸·Î °èÁ¤¿¡¼­ Oauth µ¿ÀÇ È­¸é¿¡¼­ ½ÂÀÎÇÏ°Ô µÇ´Â ³»¿ëÀÔ´Ï´Ù. CALENDAR_READONLY´Â Àб⸸ ÇÏ°Ú´Ù´Â °ÍÀ» ¶æÇÕ´Ï´Ù. Google API ¹®¼­¿¡¼­ ´Ù¸¥ SCOPE¸¦ È®ÀÎ °¡´ÉÇÕ´Ï´Ù.

  • HTTP_TRANSPORT : Google API Åë½ÅÀ» À§ÇÑ HTTP TRANSPORTÀÔ´Ï´Ù.

  • DATA_STORE_FACTORY : DATA_STORE_DIR·Î ÁöÁ¤µÈ ÆÄÀÏÀÌ ¾ø´Â °æ¿ì¿¡ ±¸±Û Oauth ÀÎÁõ ÀýÂ÷¸¦ ÁøÇàÇÏ¿© ÇØ´ç ÆÄÀÏÀ» »ý¼ºÇϸç, ÆÄÀÏÀÌ ÀÖ´Â °æ¿ì ÆÄÀÏ ¾ÈÀÇ ÀÎÁõ Á¤º¸·Î ÀÎÁõÀ» °»½ÅÇÕ´Ï´Ù.



 ´ÙÀ½À¸·Î ±¸±Û ÀÎÁõ À§ÀÇ ¼³Á¤ Á¤º¸¸¦ ÀÌ¿ëÇÏ¿© ±¸±Û ÀÎÁõÀ» ȹµæÇÏ´Â °úÁ¤ÀÔ´Ï´Ù.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public static Credential authorize() throws IOException, GeneralSecurityException {
        // Load client secrets.
        InputStream in =
                AuthCalendarUtil.class.getResourceAsStream("/client_secret.json");
        GoogleClientSecrets clientSecrets =
                GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
 
        // Build flow and trigger user authorization request.
        GoogleAuthorizationCodeFlow flow =
                new GoogleAuthorizationCodeFlow.Builder(
                        HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
                        .setDataStoreFactory(DATA_STORE_FACTORY)
                        .setAccessType("offline")
                        .build();
        Credential credential = new AuthorizationCodeInstalledApp(
                flow, new LocalServerReceiver()).authorize("user");
        System.out.println(
                "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
        return credential;
    }
cs


 2~6 : JSON_FACTORY¸¦ »ç¿ëÇÏ¿© client_secretÀ» GoogleClientSecrets·Î ¸ÊÇÎÇÕ´Ï´Ù. 

9~14 : ¼³Á¤Çß´ø HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES, DATA_STORE_FACTORY¸¦ ÀÌ¿ëÇÏ¿© flow¸¦ ºôµå!


setAccessType : offline ¸ðµå´Â ¿Â¶óÀλó ·Î±×ÀÎ, ·Î±×¾Æ¿ô°ú º°°³ÀÇ ÅäÅ«À» »ý¼ºÇÏ¿© ÀÎÁõÀ» °ü¸®ÇÏ´Â ¼³Á¤À̸砵ðÆúÆ®´Â online ÀÔ´Ï´Ù. online ¼³Á¤½Ã ¿Â¶óÀÎ ·Î±×¾Æ¿ô½Ã 

ÅäÅ«ÀÌ ¸¸·áµÇ¾î ÇØ´ç ¼­ºñ½º¿¡¼­µµ ÀÎÁõÀÌ ¾ÈµÇ°Ô µË´Ï´Ù. Çѹø ÀÎÁõÀ¸·Î °è¼Ó »ç¿ëÀ» ¿øÇÒ ½Ã¿¡´Â offline ¸ðµå·Î ÇÕ´Ï´Ù. Àú °°Àº °æ¿ì´Â º¿¿¡ ¶ç¿ï ÀÎÁõÀ̱⠶§¹®¿¡ offline ¸ðµå·Î Çß½À´Ï´Ù. ´õ Á¤È®ÇÑ ³»¿ëÀº API ¹®¼­ Âü°íÇÏ½Ã¸é µË´Ï´Ù!



ÀÎÁõ ±¸µ¿ Çغ¸±â


 º¿¿¡¼­ ÀÛ¼ºÇÑ ÀÎÁõÀ» ±¸µ¿Çغ¸¸é



 À§ »çÁø°ú °°ÀÌ ÄܼÖâ¿¡ ÇØ´ç URL·Î ÀÎÁõÇ϶ó´Â ¸Þ½ÃÁö°¡ ³ª¿É´Ï´Ù. ÇØ´ç URL·Î µé¾î°¡¼­ ·Î±×ÀÎÀ» Çϸé

 ¼³Á¤Çصξú´ø client_secretÀÌ OAuth 2.0 Ŭ¶óÀ̾ðÆ® ID ¸¦ ÀÐ¾î ¼³Á¤Çصξú´ø ¼­ºñ½º °èÁ¤ÀÎ '¿ïÆ®·Ð'ÀÌ º¸ÀÔ´Ï´Ù. ³» Ķ¸°´õ¸¦ º¾´Ï´Ù´Â SCOPE·Î ÁöÁ¤Çß´ø °ªÀ¸·Î »ç¿ëÀÚÀÇ µ¿ÀǸ¦ ¹Þ°Ô µË´Ï´Ù. Çã¿ëÀ» Ŭ¸¯Çϸé 



 callback url·Î ÅäÅ« Á¤º¸ ÆĶó¹ÌÅ͸¦ Æ÷ÇÔÇÏ¿© ÇØ´ç ¼­ºñ½º·Î ÀÎÁõ Á¤º¸¸¦ º¸³À´Ï´Ù. Àú °°Àº °æ¿ì´Â º¿À» ¶ç¿î ¼­¹ö´Â VM °¡»ó¼­¹ö¿©¼­ callbackµÈ URLÀ» º¹»çÇÏ¿© VM ³»¿¡¼­ curlÀ» »ç¿ëÇÏ¿© ÇØ´ç ¼­ºñ½º·Î º¸³Â½À´Ï´Ù.


 ¿©±â±îÁö ¿Ï·áµÇ¸é ÀÎÁõ °úÁ¤ÀÌ ³¡³ª°í System.outÀ¸·Î ¼³Á¤ÇسõÀºµ¥·Î ÇØ´ç ÆÄÀÏÀÌ ¾îµð¿¡ ÀúÀåµÇ¾ú´ÂÁö ÄַܼΠÃâ·ÂÀÌ µË´Ï´Ù. 


 

 ´ÙÀ½ ±¸µ¿½ÃºÎÅÍ´Â ÇØ´ç °æ·Î¿¡ ÇØ´ç ÆÄÀÏÀÌ ÀÖ°í À¯È¿ÇÏ´Ù¸é À§¿Í °°Àº °úÁ¤À» °ÅÄ¡Áö¾Ê°í ¹Ù·Î ÀÎÁõÀÌ µË´Ï´Ù.



Ãâó: https://kingbbode.tistory.com/8 [°³¹ß³ëÆ® - kingbbode]