½ºÇÁ¸µ ºÎÆ®¿¡¼ ±¸±Û API ¿¬µ¿ (1) ¼³Á¤ºÎÅÍ Oauth ÀÎÁõ
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]