001 package com.khubla.pragmatach.plugin.facebook;
002
003 import net.sf.json.JSONObject;
004 import net.sf.json.JSONSerializer;
005
006 import org.apache.commons.lang.StringUtils;
007 import org.apache.http.client.HttpClient;
008 import org.apache.http.client.methods.HttpGet;
009 import org.apache.http.impl.client.BasicResponseHandler;
010 import org.apache.http.impl.client.DefaultHttpClient;
011
012 import com.khubla.pragmatach.framework.api.PragmatachException;
013 import com.khubla.pragmatach.framework.api.Response;
014 import com.khubla.pragmatach.framework.application.Application;
015 import com.khubla.pragmatach.plugin.freemarker.FreemarkerController;
016
017 /**
018 * @author tome
019 */
020 public class FacebookLoginController extends FreemarkerController {
021 /**
022 * code
023 */
024 private String code;
025 /**
026 * state
027 */
028 private String state;
029 /**
030 * facebook application ID
031 */
032 private String applicationid;
033 /**
034 * facebook application secret
035 */
036 private String facebooksecret;
037 /**
038 * user's facebook id
039 */
040 private String facebookId;
041 /**
042 * user's firstname
043 */
044 private String firstName;
045 /**
046 * user's lastname
047 */
048 private String lastName;
049 /**
050 * users email
051 */
052 private String email;
053 /**
054 * redirect URL
055 */
056 private final String redirectURL;
057
058 /**
059 * ctor
060 */
061 public FacebookLoginController(String redirectURL) throws PragmatachException {
062 this.redirectURL = redirectURL;
063 applicationid = Application.getConfiguration().getParameter("facebook.applicationid");
064 facebooksecret = Application.getConfiguration().getParameter("facebook.facebooksecret");
065 }
066
067 public String getRedirectURL() {
068 return redirectURL;
069 }
070
071 public Response doLogin() throws PragmatachException {
072 final String sessionID = getRequest().getSession().getId();
073 if (sessionID != getRequest().getSession().getId()) {
074 throw new PragmatachException("CSRF Exception");
075 }
076 final String accessToken = getFacebookAccessToken(code);
077 getUserDetails(accessToken);
078 return super.render();
079 }
080
081 public String getApplicationid() {
082 return applicationid;
083 }
084
085 public String getCode() {
086 return code;
087 }
088
089 public String getEmail() {
090 return email;
091 }
092
093 private String getFacebookAccessToken(String faceCode) throws PragmatachException {
094 String token = null;
095 if ((faceCode != null) && !"".equals(faceCode)) {
096 final String redirectUrl = getApplicationURL() + "/plugins/facebook/dologin";
097 final String newUrl = "https://graph.facebook.com/oauth/access_token?client_id=" + applicationid + "&redirect_uri=" + redirectUrl + "&client_secret=" + facebooksecret + "&code=" + faceCode;
098 final HttpClient httpclient = new DefaultHttpClient();
099 try {
100 final HttpGet httpget = new HttpGet(newUrl);
101 final BasicResponseHandler responseHandler = new BasicResponseHandler();
102 final String responseBody = httpclient.execute(httpget, responseHandler);
103 token = StringUtils.removeEnd(StringUtils.removeStart(responseBody, "access_token="), "&expires=5180795");
104 } catch (final Exception e) {
105 throw new PragmatachException("Exception in getFacebookAccessToken", e);
106 } finally {
107 httpclient.getConnectionManager().shutdown();
108 }
109 }
110 return token;
111 }
112
113 public String getFacebookId() {
114 return facebookId;
115 }
116
117 public String getFacebooksecret() {
118 return facebooksecret;
119 }
120
121 public String getFacebookUrlAuth() {
122 final String sessionId = getRequest().getSession().getId();
123 final String redirectUrl = getApplicationURL() + "/plugins/facebook/dologin";
124 final String returnValue = "https://www.facebook.com/dialog/oauth?client_id=" + applicationid + "&redirect_uri=" + redirectUrl + "&state=" + sessionId;
125 return returnValue;
126 }
127
128 public String getFirstName() {
129 return firstName;
130 }
131
132 public String getLastName() {
133 return lastName;
134 }
135
136 public String getState() {
137 return state;
138 }
139
140 private String getUserDetails(String accessToken) throws PragmatachException {
141 HttpClient httpclient = new DefaultHttpClient();
142 try {
143 final String newUrl = "https://graph.facebook.com/me?access_token=" + accessToken;
144 httpclient = new DefaultHttpClient();
145 final HttpGet httpget = new HttpGet(newUrl);
146 final BasicResponseHandler responseHandler = new BasicResponseHandler();
147 final String responseBody = httpclient.execute(httpget, responseHandler);
148 final JSONObject json = (JSONObject) JSONSerializer.toJSON(responseBody);
149 facebookId = json.getString("id");
150 firstName = json.getString("first_name");
151 lastName = json.getString("last_name");
152 email = json.getString("email");
153 } catch (final Exception e) {
154 throw new PragmatachException("Exception in getUserDetails", e);
155 } finally {
156 httpclient.getConnectionManager().shutdown();
157 }
158 return email;
159 }
160
161 public void setApplicationid(String applicationid) {
162 this.applicationid = applicationid;
163 }
164
165 public void setCode(String code) {
166 this.code = code;
167 }
168
169 public void setEmail(String email) {
170 this.email = email;
171 }
172
173 public void setFacebookId(String facebookId) {
174 this.facebookId = facebookId;
175 }
176
177 public void setFacebooksecret(String facebooksecret) {
178 this.facebooksecret = facebooksecret;
179 }
180
181 public void setFirstName(String firstName) {
182 this.firstName = firstName;
183 }
184
185 public void setLastName(String lastName) {
186 this.lastName = lastName;
187 }
188
189 public void setState(String state) {
190 this.state = state;
191 }
192 }