본문 바로가기

Java

google oauth2.0

참고

본 소스는 JAVA SPRING 구조임(RESTFUL 방식)



1. 스프링에서 사용할 라이브러리를 넣자


본인은 아직 graddle 을 사용하고 있지 않아서 Maven 을 쓴다 Maven 으로 넣으니 이해바람 ㅎㅎ


	    <dependency>
		    <groupId>org.springframework.social</groupId>
		    <artifactId>spring-social-google</artifactId>
	            <version>1.0.0.RELEASE</version>
	    </dependency>



2. Google OAuth 를 파악하자.

https://console.developers.google.com/project <- 요기를 들어가면 구글에서 개발자를 위한 도구들이 많이있는데 


Google 에서 제공하는 API 를 사용하기 위해서는 프로젝트를 하나 생성해야한다~


API 인증 > 사용자 인증정보 > OAuth > 새 클라이언트 ID 만들기 를 눌러서 ID 를 생성해야 한다~


본인의 URL redirection 의 경우 http://localhost:8080/oauth2callback 이것과 같이 localhost 도 사용가능하다...


물론 hosts 에서 설정하는건 다 알고있으니까 생략~


구글역시 OAuth 2.0 을 채택하고있는데 OAuth 에 대한 설명을 하자면 너무 귀찮아서 구글도 참고문서보라고 링크만 


던져준다 ㅎㅎ 나도마찬가지.... ㅠㅠ 설명하려면 오래걸리니 이 정도는 알고오세염

https://developers.google.com/accounts/docs/OAuth2?hl=ko <-- OAuth 에 대한 설명글



모든준비가 끝났으니 실제 코드로 만나보자


3. 스프링 설정 및 Code 얻어오는 소스작성


<bean id="googleConnectionFactory" class="org.springframework.social.google.connect.GoogleConnectionFactory"> <constructor-arg value="*****************" /> <constructor-arg value="*****************" /> </bean> <bean id="googleOAuth2Parameters" class="org.springframework.social.oauth2.OAuth2Parameters"> <property name="scope" value="https://www.googleapis.com/auth/plus.login"/> <!-- <property name="scope" value="https://www.googleapis.com/auth/plus.me"/> --> <property name="redirectUri" value="http://localhost:8080/oauth2callback"/> </bean>


먼저 따로 설정잡기 귀찮아서 Spring XML 설정부분에다가 넣어줬다 요새는 @Configure 써서 Java 코드내에서 설정하는것도 

있는데 현재 프로젝트가 XML 로 설정되어있는 부분이라 같이 일하시는 분들 혼란스럽지 않게 XML 로 작성했다


googleConnectionFactory 이 부분에서는 생성자에다가 2개의 값을 넣어줘야되는데 순서에 맞게 넣어주니까 이름이나 Index를 

지정하지는 않았다... ID 와 비밀번호를 넣는 부분이니까 아까 2번에서 생성한 클라이언트 아이디와 클라이언트 보안비밀을 넣어주면 끝난다. 뭐 어렵지 않지 ㅎㅎ


실제 스프링 소스를 보자면..


	@Autowired
	private GoogleConnectionFactory googleConnectionFactory;
	
	@Autowired
	private OAuth2Parameters googleOAuth2Parameters;


위와 같이 주입을 해준다 ... 혹시라도 Facebook 이나 다른 객체에서도 사용할 경우 사용하는 이름이 같으면 스프링은 주입이 힘들기때문에 @Resource 를 쓰던가 아니면 @Qualifier 를 꼭 써줘서 내가 어떤객체를 주입하는지 알려줘야된다... 이런 실수는 안하시죠??


가장먼저 Code 발행


OAuth2Operations oauthOperations = googleConnectionFactory.getOAuthOperations(); String url = oauthOperations.buildAuthorizeUrl(GrantType.AUTHORIZATION_CODE, googleOAuth2Parameters);


저렇게 호출하면 url 값을 넘겨주는데 저 url 이 바로 google 인증하는 페이지 url 이다.. 

Controller 에서 저 url 을 redirect 시키면 구글 페이지가 열리고 해당 사용자에게 로그인하라고 하면서 

너가 접속한 웹 페이지에서 사용자의 어떠한 정보를 접근할지 알려주고 동의를 하게 만든다. 


동의를 클릭하게되면 callback url 로 code 값을 넘기는데 그 code 값으로 사용자의 정보값을 얻을 수 있다.



4. 사용자의 정보를 얻어오는 부분


OAuth2Operations oauthOperations = googleConnectionFactory.getOAuthOperations(); AccessGrant accessGrant = oauthOperations.exchangeForAccess(code, googleOAuth2Parameters.getRedirectUri(), null); String accessToken = accessGrant.getAccessToken(); Long expireTime = accessGrant.getExpireTime(); if (expireTime != null && expireTime < System.currentTimeMillis()) { accessToken = accessGrant.getRefreshToken(); logger.info("accessToken is expired. refresh token = {}" , accessToken); } Connection<Google>connection = googleConnectionFactory.createConnection(accessGrant); Google google = connection == null ? new GoogleTemplate(accessToken) : connection.getApi(); PlusOperations plusOperations = google.plusOperations(); Person person = plusOperations.getGoogleProfile();


위 부분대로 code 를 사용해서 호출하면 access_token 을 얻어오며, access_token 을 사용하여 사용자의 정보를 얻어온다.


모든 OAuth 는 동일한 방식으로 되어있어서 scope 라는게 존재하는데 구글 역시 scope의 종류가 있으며 여기서는 

사용자의 정보를 얻어오기 때문에 PlusOperations 를 사용했다.


최종적으로 Person 객체에 사용자의 정보가 담기게 되며, 그 후 작업은 뭐 알아서... 


아까 보여드린 github 사이트에는 워낙 소스도 많고 그래서 모든코드를 다 봐야할지 모르겠지만 ...


사실 스프링은 OAuth 를 대비해서 객체들을 만들어놨고 그것만 사용해도 별 문제없이 동작하게 설계되어있다.


굳이 복잡한 설계가 아니라면 ConnectionRegistry 라던지 그런건 사용안해도 그만이라는 생각... 


또한 http://gabiaxel.github.io/spring-social-google-reference/ 이 문서는 반드시 읽어보길 바람~




https://github.com/GabiAxel/spring-social-google/issues/22


출처 | http://okihouse.tistory.com/8


=============================

에러 

400 : 올바르지 않은 값이 넘어와서 에러냄

400 해결 : 과거 코드가 아닌 새로 받은 코드를 그대로 넘겨야함

403 : 로그에 ( google + api ) 를 update 하라는 말이 나옴

403 해결 : 

1. https://console.developers.google.com들어가 나의 프로젝트로 들어감

2. API 및 인증이라는 카테고리가 나옴 그안에 API라는 메뉴를 클릭

3. 소셜 API에 GOOGLE+ API 가 나옴 클릭

4. 맨위에보면 API 사용이라는 파란버튼이 나옴 클릭해서 해결