package com.blinkcoder.controller;
import com.blinkcoder.common.myConstants;
import com.blinkcoder.model.User;
import com.google.api.client.auth.oauth2.AuthorizationCodeFlow;
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.auth.oauth2.TokenResponse;
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.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.oauth2.Oauth2;
import com.google.api.services.oauth2.model.Userinfoplus;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.List;
/**
* User: Michael
* Date: 13-10-10
* Time: 下午9:27
*/
public class UserController extends MyController {
private static final String CALLBACK_URI = "http://www.blinkcoder.com/action/user/loginAfter";
/**
* OAuth 2.0 scopes.
*/
private static final List<String> SCOPES = Arrays.asList(
"https://www.googleapis.com/auth/userinfo.profile",
"https://www.googleapis.com/auth/userinfo.email");
private AuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(new NetHttpTransport(), new JacksonFactory(),
myConstants.GOOGLE_CLIENT_ID, myConstants.GOOGLE_CLIENT_SECRET_KEY, SCOPES).build();
public void login() {
String state = new BigInteger(130, new SecureRandom()).toString(32);
getSession().setAttribute("state", state);
GoogleAuthorizationCodeRequestUrl url = (GoogleAuthorizationCodeRequestUrl) flow.newAuthorizationUrl();
url.setRedirectUri(CALLBACK_URI).setState(state).build();
redirect(url.toString());
}
public void loginAfter() throws IOException {
if (!getRequest().getParameter("state").equals(getSession().getAttribute("state"))) {
getResponse().setStatus(HttpServletResponse.SC_UNAUTHORIZED);
getResponse().getWriter().print("Invalid state parameter.");
return;
}
try {
TokenResponse tokenResponse = flow.newTokenRequest(getPara("code")).setRedirectUri(CALLBACK_URI).execute();
Credential credential = flow.createAndStoreCredential(tokenResponse, null);
Oauth2 oauth = new Oauth2.Builder(new NetHttpTransport(), new JacksonFactory(), credential).setApplicationName("Blinkcoder").build();
Userinfoplus userinfo = oauth.userinfo().get().execute();
System.out.println(userinfo);
User user = User.dao.findByOpenId(userinfo.getId());
if (user == null) {
// 创建一个新用户
user = new User();
user.set("username", userinfo.getName());
user.set("email", userinfo.getEmail());
user.set("openid", userinfo.getId());
user.set("gender", userinfo.getGender());
user.set("link", userinfo.getLink());
user.set("locale", userinfo.getLocale());
user.set("picture", userinfo.getPicture());
user.set("verifiedemail", userinfo.getVerifiedEmail());
user.set("role", User.ROLE_GENERAL);
user.Save();
} else {
// 已经存在这个用户 更新部分资料
user.set("username", userinfo.getName());
user.set("email", userinfo.getEmail());
user.set("gender", userinfo.getGender());
user.set("link", userinfo.getLink());
user.set("locale", userinfo.getLocale());
user.set("picture", userinfo.getPicture());
user.set("verifiedemail", userinfo.getVerifiedEmail());
user.Update();
}
saveUserInCookie(user);
redirect("/");
} catch (TokenResponseException e) {
e.printStackTrace();
getResponse().setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
getResponse().getWriter().print("Failed to upgrade the authorization code.");
} catch (IOException e) {
e.printStackTrace();
getResponse().setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
getResponse().getWriter().print("Failed to read token data from Google. " + e.getMessage());
}
}
public void logout() {
removeCookie("blinkcoder");
getRequest().removeAttribute("g_user");
redirect("/");
}
}