2014-10-14 5 views
2

Google oauth 및 Spring MVC를 사용하는 웹 애플리케이션에서 작업 해 왔습니다. 사용자가 Google oauth에 의해 인증 된 경우 사용자가 원하는 URL로 이동되는 google oauth를 구현했습니다. 이 기능을 달성하기 위해 Google GogleAuthHelper 클래스를 사용했습니다. 여기 내 코드가Google Oauth의 스프링 보안

package com.mob.googleoauth; 

import java.io.IOException; 
import java.security.SecureRandom; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

import javax.servlet.http.HttpSession; 

import org.json.JSONException; 
import org.json.JSONObject; 

import com.google.api.client.auth.oauth2.AuthorizationCodeRequestUrl; 
import com.google.api.client.auth.oauth2.Credential; 
import com.google.api.client.auth.oauth2.TokenResponseException; 
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; 
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeRequestUrl; 
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse; 
import com.google.api.client.http.GenericUrl; 
import com.google.api.client.http.HttpRequest; 
import com.google.api.client.http.HttpRequestFactory; 
import com.google.api.client.http.HttpTransport; 
import com.google.api.client.http.javanet.NetHttpTransport; 
import com.google.api.client.json.JsonFactory; 
import com.google.api.client.json.jackson.JacksonFactory; 

public final class GoogleAuthHelper { 

    private static final String CLIENT_ID = ""; 
    private static final String CLIENT_SECRET = " "; 
    /** 
    * Callback URI that google will redirect to after successful authentication 
    */ 
    private static final String CALLBACK_URI = "http://localhost:8080/orgchart/oauthRedirect"; 
    // private static final String HD = " "; 

    // start google authentication constants 
    private static final Iterable<String> SCOPE = Arrays 
      .asList("https://www.googleapis.com/auth/userinfo.profile;https://www.googleapis.com/auth/userinfo.email" 
        .split(";")); 
    private static final String USER_INFO_URL = "https://www.googleapis.com/oauth2/v1/userinfo"; 
    private static final JsonFactory JSON_FACTORY = new JacksonFactory(); 
    private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport(); 
    // end google authentication constants 

    private String stateToken; 

    private final GoogleAuthorizationCodeFlow flow; 

    /** 
    * Constructor initializes the Google Authorization Code Flow with CLIENT 
    * ID, SECRET, and SCOPE 
    */ 
    public GoogleAuthHelper() { 

     System.out.println("google auth helper called"); 
     flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, 
       JSON_FACTORY, CLIENT_ID, CLIENT_SECRET, SCOPE).build(); 
     flow.newAuthorizationUrl().setApprovalPrompt("force").setAccessType("offline"); 
//  AuthorizationCodeRequestUrl authorizationUrl = flow 
//    .newAuthorizationUrl().setRedirectUri(CALLBACK_URI) 
//    .setApprovalPrompt("force").setAccessType("offline"); 
     generateStateToken(); 
    } 

    /** 
    * Builds a login URL based on client ID, secret, callback URI, and scope 
    */ 
    public String buildLoginUrl() { 
     System.out.println("building uri called"); 
     final GoogleAuthorizationCodeRequestUrl url = flow 
       .newAuthorizationUrl(); 

     return url.setRedirectUri(CALLBACK_URI).setState(stateToken).build(); 
    } 

    /** 
    * Generates a secure state token 
    */ 
    private void generateStateToken() { 
     System.out.println("generated token called"); 
     SecureRandom sr1 = new SecureRandom(); 
     // System.out.println(sr1); 
     stateToken = "google;" + sr1.nextInt(); 

    } 

    /** 
    * Accessor for state token 
    */ 
    public String getStateToken() { 
     System.out.println("gettoken called"); 
     return stateToken; 
    } 

    /** 
    * Expects an Authentication Code, and makes an authenticated request for 
    * the user's profile information 
    * 
    * @return JSON formatted user profile information 
    * @param authCode 
    *   authentication code provided by google 
    * @throws JSONException 
    */ 
    @SuppressWarnings("unchecked") 
    public List getUserInfoJson(final String authCode,HttpSession session) throws IOException, 
      JSONException { 
     List ls = new ArrayList();  
     try{ 
     System.out.println("getuserinfojson called"); 
     final GoogleTokenResponse response = flow.newTokenRequest(authCode) 
       .setRedirectUri(CALLBACK_URI).execute(); 
     session.setAttribute("userToken", response.getAccessToken()); 
     final Credential credential = flow.createAndStoreCredential(response, 
       null); 
     final HttpRequestFactory requestFactory = HTTP_TRANSPORT 
       .createRequestFactory(credential); 
     // Make an authenticated request 
     final GenericUrl url = new GenericUrl(USER_INFO_URL); 
     final HttpRequest request = requestFactory.buildGetRequest(url); 
     request.getHeaders().setContentType("application/json"); 
     final String jsonIdentity = request.execute().parseAsString(); 
     // System.out.println(jsonIdentity); 
     JSONObject object = new JSONObject(jsonIdentity); 

     String email = object.getString("email"); 
     String name = object.getString("name"); 
     String picture = object.getString("picture"); 


     ls.add(email); 
     ls.add(name); 
     ls.add(picture); 
     } 
     catch(NullPointerException e) 
     { 
      throw e; 
     } 
     catch (TokenResponseException e) { 
      throw e; 
     } 
     return ls; 

    } 

} 

ABove는 사용자를 인증하고 지정된 URL로 리디렉션하지만 그 후에는 응용 프로그램이 안전하지 않은 경우에 한 번 작동합니다. 내 응용 프로그램의 URL이 안전하지 않습니다. 이를 위해 Google은 oauth와 함께 봄 보안을 포함하고자합니다. 거기에 좋은 예가 있습니까? 나는 Google을 수색하고 성공하지 못했다. 나는 스프링 보안과 구글 oauth에 대한 좋은 예제를 원한다. 님의 도움에 감사드립니다.

답변

4

여기 링크를 몇 개 제공합니다. 목적을 이해하는 데 도움이되었습니다. 그것이 당신을 도울 것이라는 점을 희망하십시오. this link에서 원하는 카테고리로 이동할 수 있습니다. OAuth를위한 Spring Security를 ​​고려하면, 이것을 확인할 수 있습니다. 내가 링크를 통해 안내합니다

http://docs.spring.io/spring-security/oauth/

http://www.hsc.com/Portals/0/Uploads/Articles/WP_Securing_RESTful_WebServices_OAuth2635406646412464000.pdf

http://porterhead.blogspot.in/2014/05/securing-rest-services-with-spring.html

+0

감사합니다 !!!! –

+0

도움이되는 경우, upvote하는 것을 잊지 마라. – ajitksharma

관련 문제