Skip to content

Commit 9ed9408

Browse files
committed
I'm able to signUp and login with google!
1 parent bc32919 commit 9ed9408

File tree

14 files changed

+354
-67
lines changed

14 files changed

+354
-67
lines changed

schedule/schedule-appengine/src/main/java/com/jasify/schedule/appengine/http/HttpUserSession.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
*/
2222
public class HttpUserSession implements UserSession, HttpSessionBindingListener, Serializable {
2323
public static final String OAUTH_STATE_KEY = "oauth-request-state";
24+
public static final String OAUTH_USER_LOGIN_KEY = "oauth-user-login";
2425
static final String SESSION_KEY = "jus" /* jasify user session s*/;
2526
private static final Logger log = LoggerFactory.getLogger(HttpUserSession.class);
2627
private final String sessionId = UUID.randomUUID().toString().replaceAll("-", "");
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.jasify.schedule.appengine.http.json;
2+
3+
import com.jasify.schedule.appengine.util.JSON;
4+
5+
import java.io.Reader;
6+
7+
/**
8+
* @author krico
9+
* @since 25/12/14.
10+
*/
11+
public class JsonOAuthDetail extends JsonObject {
12+
private String email;
13+
private String realName;
14+
private boolean loggedIn;
15+
16+
public static JsonOAuthDetail parse(String data) {
17+
return JSON.fromJson(data, JsonOAuthDetail.class);
18+
}
19+
20+
public static JsonOAuthDetail parse(Reader reader) {
21+
return JSON.fromJson(reader, JsonOAuthDetail.class);
22+
}
23+
24+
public String getEmail() {
25+
return email;
26+
}
27+
28+
public void setEmail(String email) {
29+
this.email = email;
30+
}
31+
32+
public String getRealName() {
33+
return realName;
34+
}
35+
36+
public void setRealName(String realName) {
37+
this.realName = realName;
38+
}
39+
40+
public boolean isLoggedIn() {
41+
return loggedIn;
42+
}
43+
44+
public void setLoggedIn(boolean loggedIn) {
45+
this.loggedIn = loggedIn;
46+
}
47+
}

schedule/schedule-appengine/src/main/java/com/jasify/schedule/appengine/http/servlet/OAuth2CodeCallbackServlet.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@
88
import com.google.api.services.oauth2.model.Tokeninfo;
99
import com.google.api.services.oauth2.model.Userinfoplus;
1010
import com.jasify.schedule.appengine.http.HttpUserSession;
11+
import com.jasify.schedule.appengine.http.json.JsonOAuthDetail;
12+
import com.jasify.schedule.appengine.model.users.User;
13+
import com.jasify.schedule.appengine.model.users.UserLogin;
14+
import com.jasify.schedule.appengine.model.users.UserServiceFactory;
1115
import com.jasify.schedule.appengine.oauth2.OAuth2ProviderConfig;
16+
import com.jasify.schedule.appengine.util.TypeUtil;
1217
import org.apache.commons.lang3.StringUtils;
1318
import org.slf4j.Logger;
1419
import org.slf4j.LoggerFactory;
@@ -32,6 +37,10 @@ public class OAuth2CodeCallbackServlet extends HttpServlet {
3237

3338
@Override
3439
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
40+
resp.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
41+
resp.setHeader("Pragma", "no-cache");
42+
resp.setDateHeader("Expires", 0);
43+
3544
HttpSession session = req.getSession(false);
3645
if (session == null) {
3746
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "No session");
@@ -61,7 +70,8 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se
6170

6271
try {
6372

64-
OAuth2ProviderConfig googleConfig = OAuth2ProviderConfig.ProviderEnum.Google.config();
73+
OAuth2ProviderConfig.ProviderEnum provider = OAuth2ProviderConfig.ProviderEnum.Google;
74+
OAuth2ProviderConfig googleConfig = provider.config();
6575

6676
NetHttpTransport transport = new NetHttpTransport();
6777

@@ -75,13 +85,32 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se
7585

7686
Credential credential = new Credential.Builder(BearerToken.authorizationHeaderAccessMethod())
7787
.build().setFromTokenResponse(tokenResponse);
88+
//TODO: We probably need credential for later
7889

7990
Oauth2 oauth2 = new Oauth2.Builder(transport, JacksonFactory.getDefaultInstance(), credential).build();
8091
Tokeninfo tokenInfo = oauth2.tokeninfo().setAccessToken(credential.getAccessToken()).execute();
8192
Userinfoplus userInfo = oauth2.userinfo().get().execute();
93+
94+
95+
JsonOAuthDetail detail = new JsonOAuthDetail();
96+
User existingUser = UserServiceFactory.getUserService().findByLogin(provider.name(), tokenInfo.getUserId());
97+
if (existingUser == null) {
98+
UserLogin userLogin = new UserLogin(provider.name(), tokenInfo.getUserId());
99+
session.setAttribute(HttpUserSession.OAUTH_USER_LOGIN_KEY, userLogin);
100+
userLogin.setAvatar(TypeUtil.toLink(userInfo.getPicture()));
101+
userLogin.setProfile(TypeUtil.toLink(userInfo.getLink()));
102+
detail.setEmail(tokenInfo.getEmail());
103+
detail.setRealName(userInfo.getName());
104+
105+
} else {
106+
detail.setLoggedIn(true);
107+
new HttpUserSession(existingUser).put(req); //log in
108+
}
109+
110+
82111
PrintWriter writer = resp.getWriter();
83112
writer.append("<html><head><script type=\"application/json\" id=\"json-response\">");
84-
writer.append(tokenInfo.toString());//TODO: acutal data
113+
detail.toJson(writer);
85114
writer.append("</script></head><body></body></html>");
86115
} catch (TokenResponseException e) {
87116
log.info("Failed to get token", e);

schedule/schedule-appengine/src/main/java/com/jasify/schedule/appengine/http/servlet/UserServlet.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
import com.google.appengine.api.datastore.Query;
44
import com.google.common.base.Preconditions;
5+
import com.jasify.schedule.appengine.http.HttpUserSession;
56
import com.jasify.schedule.appengine.http.json.JsonSignUpUser;
67
import com.jasify.schedule.appengine.http.json.JsonUser;
78
import com.jasify.schedule.appengine.model.EntityNotFoundException;
89
import com.jasify.schedule.appengine.model.FieldValueException;
910
import com.jasify.schedule.appengine.model.UserContext;
1011
import com.jasify.schedule.appengine.model.UserSession;
1112
import com.jasify.schedule.appengine.model.users.User;
13+
import com.jasify.schedule.appengine.model.users.UserLogin;
1214
import com.jasify.schedule.appengine.model.users.UserService;
1315
import com.jasify.schedule.appengine.model.users.UserServiceFactory;
1416
import com.jasify.schedule.appengine.util.JSON;
@@ -20,6 +22,7 @@
2022
import javax.servlet.http.HttpServlet;
2123
import javax.servlet.http.HttpServletRequest;
2224
import javax.servlet.http.HttpServletResponse;
25+
import javax.servlet.http.HttpSession;
2326
import java.io.IOException;
2427
import java.util.ArrayList;
2528
import java.util.List;
@@ -138,22 +141,30 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S
138141
}
139142

140143
private void doPostCreate(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
141-
142144
try {
143-
JsonSignUpUser signUp = JsonSignUpUser.parse(req.getReader());
144-
String pw = Preconditions.checkNotNull(StringUtils.trimToNull(signUp.getPassword()), "NULL password");
145-
146145
UserService userService = UserServiceFactory.getUserService();
147146

147+
JsonSignUpUser signUp = JsonSignUpUser.parse(req.getReader());
148+
HttpSession session = req.getSession();
149+
148150
User newUser = signUp.writeTo(userService.newUser());
149151
newUser.setName(signUp.getName());
150-
151152
if (UserContext.isCurrentUserAdmin()) {
152153
newUser.setAdmin(signUp.isAdmin());
153154
}
154155

155-
new JsonUser(userService.create(newUser, signUp.getPassword())).toJson(resp.getWriter());
156+
if (session != null && session.getAttribute(HttpUserSession.OAUTH_USER_LOGIN_KEY) != null) {
157+
UserLogin login = (UserLogin) session.getAttribute(HttpUserSession.OAUTH_USER_LOGIN_KEY);
158+
userService.create(newUser, login);
159+
session.removeAttribute(HttpUserSession.OAUTH_USER_LOGIN_KEY);
160+
} else {
161+
String pw = Preconditions.checkNotNull(StringUtils.trimToNull(signUp.getPassword()), "NULL password");
162+
userService.create(newUser, pw);
163+
}
164+
if (UserContext.getCurrentUser() != null)
165+
new HttpUserSession(newUser).put(req); //login
156166

167+
new JsonUser(newUser).toJson(resp.getWriter());
157168
} catch (Exception e) {
158169
log.warn("Failed to create user", e);
159170
resp.sendError(HttpServletResponse.SC_BAD_REQUEST);

schedule/schedule-appengine/src/main/java/com/jasify/schedule/appengine/model/users/UserLogin.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.jasify.schedule.appengine.model.users;
22

33
import com.google.appengine.api.datastore.Key;
4+
import com.google.appengine.api.datastore.Link;
45
import com.google.common.base.Preconditions;
56
import org.slim3.datastore.*;
67

8+
import java.io.Serializable;
79
import java.util.Date;
810

911
/**
@@ -13,7 +15,7 @@
1315
* @since 23/12/14.
1416
*/
1517
@Model
16-
public class UserLogin {
18+
public class UserLogin implements Serializable {
1719
@Attribute(primaryKey = true)
1820
private Key id;
1921

@@ -30,6 +32,9 @@ public class UserLogin {
3032
*/
3133
private String userId;
3234

35+
private Link profile;
36+
private Link avatar;
37+
3338
private ModelRef<User> userRef = new ModelRef<>(User.class);
3439

3540
public UserLogin() {
@@ -94,19 +99,29 @@ public void setUserId(String userId) {
9499
this.userId = userId;
95100
}
96101

102+
public Link getAvatar() {
103+
return avatar;
104+
}
105+
106+
public void setAvatar(Link avatar) {
107+
this.avatar = avatar;
108+
}
109+
97110
@Override
98111
public boolean equals(Object o) {
99112
if (this == o) return true;
100113
if (!(o instanceof UserLogin)) return false;
101114

102115
UserLogin userLogin = (UserLogin) o;
103116

117+
if (avatar != null ? !avatar.equals(userLogin.avatar) : userLogin.avatar != null) return false;
104118
if (created != null ? !created.equals(userLogin.created) : userLogin.created != null) return false;
105-
if (userId != null ? !userId.equals(userLogin.userId) : userLogin.userId != null)
106-
return false;
107119
if (id != null ? !id.equals(userLogin.id) : userLogin.id != null) return false;
108120
if (modified != null ? !modified.equals(userLogin.modified) : userLogin.modified != null) return false;
121+
if (profile != null ? !profile.equals(userLogin.profile) : userLogin.profile != null) return false;
109122
if (provider != null ? !provider.equals(userLogin.provider) : userLogin.provider != null) return false;
123+
if (userId != null ? !userId.equals(userLogin.userId) : userLogin.userId != null) return false;
124+
if (userRef != null ? !userRef.equals(userLogin.userRef) : userLogin.userRef != null) return false;
110125

111126
return true;
112127
}
@@ -118,17 +133,32 @@ public int hashCode() {
118133
result = 31 * result + (modified != null ? modified.hashCode() : 0);
119134
result = 31 * result + (provider != null ? provider.hashCode() : 0);
120135
result = 31 * result + (userId != null ? userId.hashCode() : 0);
136+
result = 31 * result + (profile != null ? profile.hashCode() : 0);
137+
result = 31 * result + (avatar != null ? avatar.hashCode() : 0);
138+
result = 31 * result + (userRef != null ? userRef.hashCode() : 0);
121139
return result;
122140
}
123141

142+
public Link getProfile() {
143+
144+
return profile;
145+
}
146+
147+
public void setProfile(Link profile) {
148+
this.profile = profile;
149+
}
150+
124151
@Override
125152
public String toString() {
126-
return getClass().getSimpleName() + "{" +
153+
return "UserLogin{" +
127154
"id=" + id +
128155
", created=" + created +
129156
", modified=" + modified +
130157
", provider='" + provider + '\'' +
131158
", userId='" + userId + '\'' +
159+
", profile=" + profile +
160+
", avatar=" + avatar +
161+
", userRef=" + userRef +
132162
'}';
133163
}
134164
}

schedule/schedule-appengine/src/main/java/com/jasify/schedule/appengine/util/TypeUtil.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.jasify.schedule.appengine.util;
22

33
import com.google.appengine.api.datastore.Email;
4+
import com.google.appengine.api.datastore.Link;
45
import com.google.appengine.api.datastore.ShortBlob;
56
import com.google.appengine.api.datastore.Text;
67

@@ -24,10 +25,18 @@ public static String toString(Text text) {
2425
return text == null ? null : text.getValue();
2526
}
2627

28+
public static String toString(Link link) {
29+
return link == null ? null : link.getValue();
30+
}
31+
2732
public static Text toText(String text) {
2833
return text == null ? null : new Text(text);
2934
}
3035

36+
public static Link toLink(String url) {
37+
return url == null ? null : new Link(url);
38+
}
39+
3140

3241
public static byte[] toBytes(ShortBlob shortBlob) {
3342
return shortBlob == null ? null : shortBlob.getBytes();

schedule/schedule-appengine/src/main/webapp/js/application.js

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -184,32 +184,38 @@ jasifyScheduleApp.factory('Auth', ['$log', '$http', '$q', '$cookies', 'Session',
184184
data: null
185185
};
186186

187-
Auth.restore = function () {
188-
if (!$cookies.loggedIn) {
189-
restore.invoked = true;
190-
restore.failed = true;
191-
restore.data = 'Not logged in';
192-
}
187+
Auth.restore = function (force) {
188+
if (force) {
189+
restore.invoked = false;
190+
restore.failed = false;
191+
restore.promise = null;
192+
restore.data = null;
193+
} else {
194+
if (!$cookies.loggedIn) {
195+
restore.invoked = true;
196+
restore.failed = true;
197+
restore.data = 'Not logged in';
198+
}
193199

194-
if (restore.invoked) {
195-
//This is a cache of the last restore call, we make it look like it was called again
200+
if (restore.invoked) {
201+
//This is a cache of the last restore call, we make it look like it was called again
196202

197-
if (restore.promise != null) {
198-
//In case the http request is pending
199-
return $q.when(restore.promise);
200-
}
203+
if (restore.promise != null) {
204+
//In case the http request is pending
205+
return $q.when(restore.promise);
206+
}
201207

202-
var deferred = $q.defer();
208+
var deferred = $q.defer();
203209

204-
if (restore.failed) {
205-
deferred.reject(restore.data);
206-
} else {
207-
deferred.resolve(restore.data);
208-
}
210+
if (restore.failed) {
211+
deferred.reject(restore.data);
212+
} else {
213+
deferred.resolve(restore.data);
214+
}
209215

210-
return deferred.promise;
216+
return deferred.promise;
217+
}
211218
}
212-
213219
restore.invoked = true;
214220

215221
$log.debug("Restoring session...");
@@ -393,9 +399,9 @@ jasifyScheduleApp.factory('Popup', ['$log', '$q', '$interval', '$window', functi
393399
var script = popupWindow.document.getElementById("json-response");
394400
popupWindow.close();
395401
$interval.cancel(waiting);
402+
popupWindow = null;
396403
if (script && script.text) {
397404
var r = angular.fromJson(script.text);
398-
$log.debug(script.text);
399405
deferred.resolve(r);
400406
} else {
401407
deferred.reject('Bad response...');
@@ -405,8 +411,9 @@ jasifyScheduleApp.factory('Popup', ['$log', '$q', '$interval', '$window', functi
405411
$log.debug("E: " + error);
406412
}
407413

408-
if (popupWindow.closed) {
414+
if (popupWindow && popupWindow.closed) {
409415
$interval.cancel(waiting);
416+
popupWindow = null;
410417
deferred.reject('Authorization failed (window closed)');
411418
}
412419
}, 34);

0 commit comments

Comments
 (0)