Author: a_horuzhenko
Date: Tue Aug 13 05:47:34 2013
New Revision: 1513355

URL: http://svn.apache.org/r1513355
Log:
[OPENMEETINGS-740] Login via OAuth2: fixes and improvements.

Modified:
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/installation/ImportInitvalues.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInPage.java

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/installation/ImportInitvalues.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/installation/ImportInitvalues.java?rev=1513355&r1=1513354&r2=1513355&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/installation/ImportInitvalues.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/installation/ImportInitvalues.java
 Tue Aug 13 05:47:34 2013
@@ -1017,6 +1017,23 @@ public class ImportInitvalues {
                googleServer.setFirstnameParamName("given_name");
                googleServer.setLastnameParamName("family_name");
                oauthDao.update(googleServer, null);
+               
+               // Facebook
+               OAuthServer facebookServer = new OAuthServer();
+               facebookServer.setName("Facebook");
+               facebookServer.setEnabled(false);
+               facebookServer.setClientId("<put your client_id>");
+               facebookServer.setClientSecret("<put your client_secret>");
+               
facebookServer.setRequestKeyUrl("https://www.facebook.com/dialog/oauth?client_id={$client_id}&redirect_uri={$redirect_uri}&scope=email";);
+               
facebookServer.setRequestTokenUrl("https://graph.facebook.com/oauth/access_token";);
+               facebookServer.setRequestTokenMethod(RequestMethod.POST);
+               
facebookServer.setRequestTokenAttributes("client_id={$client_id}&redirect_uri={$redirect_uri}&client_secret={$client_secret}&code={$code}");
+               
facebookServer.setRequestInfoUrl("https://graph.facebook.com/me?access_token={$access_token}&fields=username,first_name,last_name,email";);
+               facebookServer.setLoginParamName("username");
+               facebookServer.setEmailParamName("email");
+               facebookServer.setFirstnameParamName("first_name");
+               facebookServer.setLastnameParamName("last_name");
+               oauthDao.update(facebookServer, null);
        }
        
        // 
------------------------------------------------------------------------------

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInPage.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInPage.java?rev=1513355&r1=1513354&r2=1513355&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInPage.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInPage.java
 Tue Aug 13 05:47:34 2013
@@ -53,7 +53,6 @@ import org.apache.openmeetings.data.user
 import org.apache.openmeetings.data.user.dao.UsersDao;
 import org.apache.openmeetings.persistence.beans.user.User;
 import org.apache.openmeetings.persistence.beans.user.oauth.OAuthServer;
-import org.apache.openmeetings.utils.crypt.ManageCryptStyle;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.pages.BaseInitedPage;
@@ -106,7 +105,7 @@ public class SignInPage extends BaseInit
                                                log.debug("OAuthInfo=" + 
authInfo);
                                                Map<String, String> authParams 
= getAuthParams(authInfo.accessToken, code, server);
                                                if (authParams != null) {
-                                                       
loginViaOAuth2(authParams);
+                                                       
loginViaOAuth2(authParams, serverId);
                                                }
                                        } else { // redirect to get code
                                                String redirectUrl = 
prepareUrlParams(server.getRequestKeyUrl(), server.getClientId(), 
@@ -259,7 +258,14 @@ public class SignInPage extends BaseInit
                                result.expiresIn = 
jsonResult.getLong("expires_in");
                        }
                } catch (JSONException e) {
-                       log.error("Couldn't parse json response " + 
sourceJson.toString(), e);
+                       // try to parse as canonical
+                       Map<String, String> parsedMap = 
parseCanonicalResponse(sourceJson.toString());
+                       result.accessToken = parsedMap.get("access_token");
+                       result.refreshToken = parsedMap.get("refresh_token");
+                       result.tokenType = parsedMap.get("token_type");
+                       try {
+                               result.expiresIn = 
Long.valueOf(parsedMap.get("expires_in"));
+                       } catch (NumberFormatException nfe) {}
                }
                // access token must be specified
                if (result.accessToken == null) {
@@ -269,6 +275,18 @@ public class SignInPage extends BaseInit
                return result;
        }
        
+       private Map<String, String> parseCanonicalResponse(String response) {
+               String[] parts = response.split("&");
+               Map<String, String> result = new HashMap<String, String>();
+               for (String part: parts) {
+                       String pair[] = part.split("=");
+                       if (pair.length > 1) {
+                               result.put(pair[0], pair[1]);
+                       }
+               }
+               return result;
+       }
+       
        private Map<String, String> getAuthParams(String token, String code, 
OAuthServer server) throws IOException {
                // get attributes names
                String loginAttributeName = server.getLoginParamName();
@@ -284,18 +302,18 @@ public class SignInPage extends BaseInit
                prepareConnection(connection);
                BufferedReader in = new BufferedReader(new 
InputStreamReader(connection.getInputStream()));
                String inputLine = null;
-               StringBuilder sourceJson = new StringBuilder();
+               StringBuilder sourceResponse = new StringBuilder();
                while ((inputLine = in.readLine()) != null) {
-                       if (sourceJson.length() > 0) {
-                               sourceJson.append("\n");
+                       if (sourceResponse.length() > 0) {
+                               sourceResponse.append("\n");
                        }
-                       sourceJson.append(inputLine);
+                       sourceResponse.append(inputLine);
                }
         in.close();
         // parse json result
         Map<String, String> result = new HashMap<String, String>();
         try {
-                       JSONObject parsedJson = new 
JSONObject(sourceJson.toString());
+                       JSONObject parsedJson = new 
JSONObject(sourceResponse.toString());
                        result.put("login", 
parsedJson.getString(loginAttributeName));
                        result.put("email", 
parsedJson.getString(emailAttributeName));
                        if (parsedJson.has(firstname)) {
@@ -305,17 +323,24 @@ public class SignInPage extends BaseInit
                                result.put("lastname", 
parsedJson.getString(lastname));
                        }
                } catch (JSONException e) {
-                       log.error("Couldn't parse json response:\n" + 
sourceJson.toString(), e);
-                       return null;
+                       // try to parse response as canonical
+                       Map<String, String> parsedMap = 
parseCanonicalResponse(sourceResponse.toString());
+                       result.put("login", parsedMap.get(loginAttributeName));
+                       result.put("email", parsedMap.get(emailAttributeName));
+                       if (parsedMap.containsKey(firstname)) {
+                               result.put("firstname", 
parsedMap.get(firstname));
+                       }
+                       if (parsedMap.containsKey(lastname)) {
+                               result.put("lastname", parsedMap.get(lastname));
+                       }
                }
                return result;
        }
        
-       private void loginViaOAuth2(Map<String, String> params) throws 
IOException, NoSuchAlgorithmException {
+       private void loginViaOAuth2(Map<String, String> params, long serverId) 
throws IOException, NoSuchAlgorithmException {
                UsersDao userDao = getBean(UsersDao.class);
                UserManager userManager = getBean(UserManager.class); 
                ConfigurationDao configurationDao = 
getBean(ConfigurationDao.class);
-               ManageCryptStyle manageCryptStyle = 
getBean(ManageCryptStyle.class);
                String login = params.get("login");
                String email = params.get("email");
                String lastname = params.get("lastname");
@@ -334,11 +359,21 @@ public class SignInPage extends BaseInit
                if (user == null) {
                        Integer defaultlangId = 
Integer.valueOf(configurationDao.getConfValue("default_lang_id", String.class, 
"1"));
                        String defaultTimezone = 
configurationDao.getConfValue("default.timezone", String.class, "");           
-                       userManager.registerUserNoEmail(login, pass, lastname, 
firstname, email, null, null, 
+                       Long res = userManager.registerUserNoEmail(login, pass, 
lastname, firstname, email, null, null, 
                                        null, null, null, 0, null, 
defaultlangId, null, false, true, defaultTimezone);
-               } else { // just change password
-                       user.updatePassword(manageCryptStyle, configurationDao, 
pass);
+                       if (res == null || res < 0) {
+                               throw new RuntimeException("Couldn't register 
new oauth user");
+                       }
+                       user = userDao.get(res);
+                       user.setExternalUserType("oauth2." + serverId);
                        userDao.update(user, null);
+               } else { // just change password
+                       // check user type before changing password, it must be 
match oauthServerId
+                       if (!("oauth2." + 
serverId).equals(user.getExternalUserType())) {
+                               log.error("User already registered!");
+                               return;
+                       }
+                       user = userDao.update(user, pass, -1);
                }
                
                if (WebSession.get().signIn(login, pass, null)) {


Reply via email to