Skip to content

Commit 5993e79

Browse files
author
Eugen
committed
Merge pull request eugenp#146 from Doha2012/master
spring oauth reddit submit
2 parents d1d0e0d + 1dcf4a3 commit 5993e79

File tree

5 files changed

+135
-30
lines changed

5 files changed

+135
-30
lines changed

spring-security-oauth/src/main/java/org/baeldung/config/MyAuthorizationCodeAccessTokenProvider.java

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,14 @@
2525
import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeAccessTokenProvider;
2626
import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeResourceDetails;
2727
import org.springframework.security.oauth2.common.OAuth2AccessToken;
28-
import org.springframework.security.oauth2.common.OAuth2RefreshToken;
2928
import org.springframework.security.oauth2.common.exceptions.InvalidRequestException;
3029
import org.springframework.security.oauth2.common.util.OAuth2Utils;
3130
import org.springframework.util.LinkedMultiValueMap;
3231
import org.springframework.util.MultiValueMap;
3332
import org.springframework.web.client.ResponseExtractor;
3433

34+
import com.google.common.base.Joiner;
35+
3536
public class MyAuthorizationCodeAccessTokenProvider extends AuthorizationCodeAccessTokenProvider {
3637

3738
private StateKeyGenerator stateKeyGenerator = new DefaultStateKeyGenerator();
@@ -42,7 +43,6 @@ public class MyAuthorizationCodeAccessTokenProvider extends AuthorizationCodeAcc
4243

4344
@Override
4445
public String obtainAuthorizationCode(OAuth2ProtectedResourceDetails details, AccessTokenRequest request) throws UserRedirectRequiredException, UserApprovalRequiredException, AccessDeniedException, OAuth2AccessDeniedException {
45-
4646
AuthorizationCodeResourceDetails resource = (AuthorizationCodeResourceDetails) details;
4747

4848
HttpHeaders headers = getHeadersForAuthorizationRequest(request);
@@ -97,12 +97,10 @@ public ResponseEntity<Void> extractData(ClientHttpResponse response) throws IOEx
9797
}
9898
request.set("code", code);
9999
return code;
100-
101100
}
102101

103102
@Override
104103
public OAuth2AccessToken obtainAccessToken(OAuth2ProtectedResourceDetails details, AccessTokenRequest request) throws UserRedirectRequiredException, UserApprovalRequiredException, AccessDeniedException, OAuth2AccessDeniedException {
105-
106104
AuthorizationCodeResourceDetails resource = (AuthorizationCodeResourceDetails) details;
107105

108106
if (request.getAuthorizationCode() == null) {
@@ -112,24 +110,10 @@ public OAuth2AccessToken obtainAccessToken(OAuth2ProtectedResourceDetails detail
112110
obtainAuthorizationCode(resource, request);
113111
}
114112
return retrieveToken(request, resource, getParametersForTokenRequest(resource, request), getHeadersForTokenRequest(request));
115-
116-
}
117-
118-
@Override
119-
public OAuth2AccessToken refreshAccessToken(OAuth2ProtectedResourceDetails resource, OAuth2RefreshToken refreshToken, AccessTokenRequest request) throws UserRedirectRequiredException, OAuth2AccessDeniedException {
120-
MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>();
121-
form.add("grant_type", "refresh_token");
122-
form.add("refresh_token", refreshToken.getValue());
123-
try {
124-
return retrieveToken(request, resource, form, getHeadersForTokenRequest(request));
125-
} catch (OAuth2AccessDeniedException e) {
126-
throw getRedirectForAuthorization((AuthorizationCodeResourceDetails) resource, request);
127-
}
128113
}
129114

130115
private HttpHeaders getHeadersForTokenRequest(AccessTokenRequest request) {
131116
HttpHeaders headers = new HttpHeaders();
132-
// No cookie for token request
133117
return headers;
134118
}
135119

@@ -143,7 +127,6 @@ private HttpHeaders getHeadersForAuthorizationRequest(AccessTokenRequest request
143127
}
144128

145129
private MultiValueMap<String, String> getParametersForTokenRequest(AuthorizationCodeResourceDetails resource, AccessTokenRequest request) {
146-
147130
MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>();
148131
form.set("grant_type", "authorization_code");
149132
form.set("code", request.getAuthorizationCode());
@@ -167,19 +150,17 @@ private MultiValueMap<String, String> getParametersForTokenRequest(Authorization
167150
}
168151

169152
return form;
170-
171153
}
172154

173155
private MultiValueMap<String, String> getParametersForAuthorizeRequest(AuthorizationCodeResourceDetails resource, AccessTokenRequest request) {
174-
175156
MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>();
176157
form.set("response_type", "code");
177158
form.set("client_id", resource.getClientId());
178159

179160
if (request.get("scope") != null) {
180161
form.set("scope", request.getFirst("scope"));
181162
} else {
182-
form.set("scope", OAuth2Utils.formatParameterList(resource.getScope()));
163+
form.set("scope", Joiner.on(',').join(resource.getScope()));
183164
}
184165

185166
String redirectUri = resource.getPreEstablishedRedirectUri();
@@ -204,17 +185,13 @@ private MultiValueMap<String, String> getParametersForAuthorizeRequest(Authoriza
204185
}
205186

206187
return form;
207-
208188
}
209189

210190
private UserRedirectRequiredException getRedirectForAuthorization(AuthorizationCodeResourceDetails resource, AccessTokenRequest request) {
211-
212-
// we don't have an authorization code yet. So first get that.
213191
TreeMap<String, String> requestParameters = new TreeMap<String, String>();
214-
requestParameters.put("response_type", "code"); // oauth2 spec, section 3
192+
requestParameters.put("response_type", "code");
215193
requestParameters.put("client_id", resource.getClientId());
216194
requestParameters.put("duration", "permanent");
217-
// Client secret is not required in the initial authorization request
218195

219196
String redirectUri = resource.getRedirectUri(request);
220197
if (redirectUri != null) {
@@ -231,7 +208,7 @@ private UserRedirectRequiredException getRedirectForAuthorization(AuthorizationC
231208
while (scopeIt.hasNext()) {
232209
builder.append(scopeIt.next());
233210
if (scopeIt.hasNext()) {
234-
builder.append(' ');
211+
builder.append(',');
235212
}
236213
}
237214
}
@@ -248,7 +225,6 @@ private UserRedirectRequiredException getRedirectForAuthorization(AuthorizationC
248225
request.setPreservedState(redirectUri);
249226

250227
return redirectException;
251-
252228
}
253229

254230
}

spring-security-oauth/src/main/java/org/baeldung/config/WebConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public OAuth2ProtectedResourceDetails reddit() {
8585
details.setAccessTokenUri(accessTokenUri);
8686
details.setUserAuthorizationUri(userAuthorizationUri);
8787
details.setTokenName("oauth_token");
88-
details.setScope(Arrays.asList("identity"));
88+
details.setScope(Arrays.asList("identity", "read", "submit"));
8989
details.setGrantType("authorization_code");
9090
return details;
9191
}

spring-security-oauth/src/main/java/org/baeldung/web/RedditController.java

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,26 @@
11
package org.baeldung.web;
22

3+
import java.io.IOException;
4+
import java.util.ArrayList;
5+
import java.util.HashMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
39
import org.slf4j.Logger;
410
import org.slf4j.LoggerFactory;
11+
import org.springframework.http.HttpEntity;
12+
import org.springframework.http.HttpHeaders;
13+
import org.springframework.http.MediaType;
14+
import org.springframework.http.ResponseEntity;
515
import org.springframework.security.oauth2.client.OAuth2RestTemplate;
616
import org.springframework.security.oauth2.client.resource.UserApprovalRequiredException;
717
import org.springframework.security.oauth2.client.resource.UserRedirectRequiredException;
818
import org.springframework.stereotype.Controller;
919
import org.springframework.ui.Model;
1020
import org.springframework.web.bind.annotation.RequestMapping;
21+
import org.springframework.web.bind.annotation.RequestParam;
1122

23+
import com.fasterxml.jackson.core.JsonProcessingException;
1224
import com.fasterxml.jackson.databind.JsonNode;
1325
import com.fasterxml.jackson.databind.ObjectMapper;
1426

@@ -36,6 +48,81 @@ public String getInfo(Model model) {
3648
return "reddit";
3749
}
3850

51+
@RequestMapping("/submit")
52+
public String submit(Model model, @RequestParam Map<String, String> formParams) {
53+
try {
54+
System.out.println(formParams.keySet());
55+
HttpHeaders headers = new HttpHeaders();
56+
headers.setContentType(MediaType.APPLICATION_JSON);
57+
HttpEntity req = new HttpEntity(headers);
58+
59+
Map<String, String> param = new HashMap<String, String>();
60+
param.put("api_type", "json");
61+
param.put("kind", "self");
62+
param.put("sr", "api");
63+
// param.put("iden", "XCzyTdJveIcYXNhLJ4a2X9WVDswtx83u");
64+
// param.put("captcha", "BJMGMU");
65+
// param.put("title", "http2 is coming soon");
66+
// param.put("text", "http2 is coming soon what do you think about that");
67+
param.putAll(formParams);
68+
69+
System.out.println(param.keySet());
70+
System.out.println(param.entrySet());
71+
ResponseEntity<String> result = redditRestTemplate.postForEntity("https://oauth.reddit.com/api/submit", req, String.class, param);
72+
model.addAttribute("error", result.getBody());
73+
} catch (UserApprovalRequiredException e) {
74+
throw e;
75+
} catch (UserRedirectRequiredException e) {
76+
throw e;
77+
} catch (Exception e) {
78+
LOGGER.error("Error occurred", e);
79+
model.addAttribute("error", e.getLocalizedMessage());
80+
}
81+
return "reddit";
82+
}
83+
84+
@RequestMapping("/post")
85+
public String showSubmissionForm(Model model) throws JsonProcessingException, IOException {
86+
String needsCaptchaResult = needsCaptcha();
87+
if (needsCaptchaResult.equalsIgnoreCase("true")) {
88+
String newCaptchaResult = getNewCaptcha();
89+
String[] split = newCaptchaResult.split("\"");
90+
String iden = split[split.length - 2];
91+
model.addAttribute("iden", iden.trim());
92+
}
93+
return "submissionForm";
94+
}
95+
96+
//
97+
98+
public List<String> getSubreddit(Model model) throws JsonProcessingException, IOException {
99+
String result = redditRestTemplate.getForObject("https://oauth.reddit.com/subreddits/popular", String.class);
100+
JsonNode node = new ObjectMapper().readTree(result);
101+
node = node.get("data").get("children");
102+
List<String> subreddits = new ArrayList<String>();
103+
for (JsonNode child : node) {
104+
subreddits.add(child.get("data").get("display_name").asText());
105+
}
106+
return subreddits;
107+
}
108+
109+
public String needsCaptcha() {
110+
String result = redditRestTemplate.getForObject("https://oauth.reddit.com/api/needs_captcha.json", String.class);
111+
return result;
112+
}
113+
114+
public String getNewCaptcha() {
115+
HttpHeaders headers = new HttpHeaders();
116+
headers.setContentType(MediaType.APPLICATION_JSON);
117+
HttpEntity req = new HttpEntity(headers);
118+
119+
Map<String, String> param = new HashMap<String, String>();
120+
param.put("api_type", "json");
121+
122+
ResponseEntity<String> result = redditRestTemplate.postForEntity("https://oauth.reddit.com/api/new_captcha", req, String.class, param);
123+
return result.getBody();
124+
}
125+
39126
public void setRedditRestTemplate(OAuth2RestTemplate redditRestTemplate) {
40127
this.redditRestTemplate = redditRestTemplate;
41128
}

spring-security-oauth/src/main/webapp/WEB-INF/jsp/reddit.jsp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
<c:when test="${info != null}">
1010
<h1>Your Reddit Info</h1>
1111
<b>Your reddit username is </b>${info}
12+
<br>
13+
<a href="post">Submit to Reddit</a>
1214
</c:when>
1315
<c:otherwise>
1416
<b>Sorry, error occurred</b>
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
2+
<html xmlns="http://www.w3.org/1999/xhtml">
3+
<head>
4+
5+
<title>Spring Security OAuth</title>
6+
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
7+
8+
</head>
9+
<body>
10+
<div class="container">
11+
<h1>Submit to Reddit</h1>
12+
<form action="submit" method="post">
13+
<div class="row">
14+
<div class="form-group">
15+
<label class="col-sm-3">Title</label>
16+
<span class="col-sm-9"><input name="title" placeholder="title" class="form-control" /></span>
17+
</div>
18+
<br><br>
19+
<div class="form-group">
20+
<label class="col-sm-3">Content</label>
21+
<span class="col-sm-9"><textarea placeholder="content" class="form-control"></textarea></span>
22+
</div>
23+
<br><br>
24+
<c:if test="${iden != null}">
25+
<input type="hidden" name="iden" value="${iden}"/>
26+
27+
<div class="form-group">
28+
<label class="col-sm-3">Captcha</label>
29+
<span class="col-sm-9"><input name="captcha" placeholder="captcha" class="form-control"/></span>
30+
</div>
31+
<br><br>
32+
<img src="http://www.reddit.com/captcha/${iden}" alt="captcha" width="200"/>
33+
</c:if>
34+
<br><br>
35+
<button type="submit" class="btn btn-primary">Post</button>
36+
</div>
37+
</form>
38+
</div>
39+
</body>
40+
</html>

0 commit comments

Comments
 (0)