Veröffentlichen Sie einen Link zur Reddit-API

Sicherheit Top

Ich habe gerade den neuen Learn Spring Security-Kurs angekündigt, einschließlich des vollständigen Materials zum neuen OAuth2-Stack in Spring Security 5:

>> PRÜFEN SIE DEN KURSREST Oben

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs

1. Übersicht

In diesem zweiten Artikel der Reihe werden wir einige einfache Funktionen erstellen, die über ihre API aus unserer Anwendung auf Reddit veröffentlicht werden können.

2. Notwendige Sicherheit

Erstens - lassen Sie uns den Sicherheitsaspekt aus dem Weg räumen.

Um einen Link an Reddit zu senden , müssen wir eine OAuth-geschützte Ressource mit dem GeltungsbereichSenden “ definieren:

@Bean public OAuth2ProtectedResourceDetails reddit() { AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails(); details.setId("reddit"); details.setClientId(clientID); details.setClientSecret(clientSecret); details.setAccessTokenUri(accessTokenUri); details.setUserAuthorizationUri(userAuthorizationUri); details.setTokenName("oauth_token"); details.setScope(Arrays.asList("identity", "submit")); details.setGrantType("authorization_code"); return details; }

Beachten Sie, dass wir auch den Bereich " Identität " angeben, da wir auch Zugriff auf die Benutzerkontoinformationen benötigen.

3. Wird Captcha benötigt?

Benutzer, die neu bei Reddit sind, müssen ein Captcha ausfüllen, um es einzureichen. Das heißt, bevor sie eine bestimmte Karma-Schwelle innerhalb von Reddit überschreiten.

Für diese Benutzer müssen wir zuerst prüfen, ob das Captcha benötigt wird:

private String needsCaptcha() { String result = redditRestTemplate.getForObject( "//oauth.reddit.com/api/needs_captcha.json", String.class); return result; } private String getNewCaptcha() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity req = new HttpEntity(headers); Map param = new HashMap(); param.put("api_type", "json"); ResponseEntity result = redditRestTemplate.postForEntity( "//oauth.reddit.com/api/new_captcha", req, String.class, param); String[] split = result.getBody().split("""); return split[split.length - 2]; }

4. Das Formular " Beitrag senden "

Als Nächstes erstellen wir das Hauptformular zum Senden neuer Beiträge an Reddit. Das Senden eines Links erfordert die folgenden Details:

  • Titel - der Titel des Artikels
  • url - die URL des Artikels
  • subreddit - das Sub-Reddit, an das der Link gesendet werden soll

Mal sehen, wie wir diese einfache Einreichungsseite anzeigen können:

@RequestMapping("/post") public String showSubmissionForm(Model model) throws JsonProcessingException, IOException { String needsCaptchaResult = needsCaptcha(); if (needsCaptchaResult.equalsIgnoreCase("true")) { String iden = getNewCaptcha(); model.addAttribute("iden", iden); } return "submissionForm"; }

Und natürlich die grundlegende SubmissionForm.html :

 Post   function submitPost(){ var data = {}; $('form').serializeArray().map(function(x){data[x.name] = x.value;}); $.ajax({ url: "api/posts", data: JSON.stringify(data), type: 'POST', contentType:'application/json' }).done(function(data) { if(data.length < 2){ alert(data[0]);} else{ window.location.href="submissionResponse?msg="+ data[0]+"&url="+data[1]; } }).fail(function(error) { alert(error.responseText); }); } 

5. Senden Sie einen Link an Reddit

Schauen wir uns nun den letzten Schritt an und senden Sie den eigentlichen Link über die Reddit-API.

Wir senden eine Übermittlungsanforderung an Reddit unter Verwendung der Parameter aus unserer Übermittlungsform :

@Controller @RequestMapping(value = "/api/posts") public class RedditPostRestController { @Autowired private RedditService service; @RequestMapping(method = RequestMethod.POST) @ResponseBody public List submit(@Valid @RequestBody PostDto postDto) { return service.submitPost(postDto); } }

Hier ist die eigentliche Methodenimplementierung:

public List submitPost(PostDto postDto) { MultiValueMap param1 = constructParams(postDto); JsonNode node = redditTemplate.submitPost(param1); return parseResponse(node); } private MultiValueMap constructParams(PostDto postDto) { MultiValueMap param = new LinkedMultiValueMap(); param.add("title", postDto.getTitle()); param.add("sr", postDto.getSubreddit()); param.add("url", postDto.getUrl()); param.add("iden", postDto.getIden()); param.add("captcha", postDto.getCaptcha()); if (postDto.isSendReplies()) { param.add("sendReplies", "true"); } param.add("api_type", "json"); param.add("kind", "link"); param.add("resubmit", "true"); param.add("then", "comments"); return param; }

Und die einfache Parsing-Logik, die die Antwort von der Reddit-API verarbeitet:

private List parseResponse(JsonNode node) { String result = ""; JsonNode errorNode = node.get("json").get("errors").get(0); if (errorNode != null) { for (JsonNode child : errorNode) null", "") + "

"; return Arrays.asList(result); } else { if ((node.get("json").get("data") != null) && (node.get("json").get("data").get("url") != null)) { return Arrays.asList("Post submitted successfully", node.get("json").get("data").get("url").asText()); } else { return Arrays.asList("Error Occurred while parsing Response"); } } }

All dies funktioniert mit einem einfachen DTO :

public class PostDto { @NotNull private String title; @NotNull private String url; @NotNull private String subreddit; private boolean sendReplies; private String iden; private String captcha; }

Endlich - die SubmissionResponse.html :

Hello

Hello

Here

6. Fazit

In diesem kurzen Tutorial haben wir einige grundlegende Funktionen zum Senden an Reddit implementiert - einfach, aber voll funktionsfähig.

Im nächsten Teil dieser Fallstudie implementieren wir eine Schedule Post for Later- Funktionalität in unsere App.

Die vollständige Implementierung dieses Tutorials finden Sie im Github-Projekt. Dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein.

Sicherheit unten

Ich habe gerade den neuen Learn Spring Security-Kurs angekündigt, einschließlich des vollständigen Materials zum neuen OAuth2-Stack in Spring Security 5:

>> PRÜFEN SIE DEN KURSREST unten

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs