Pošaljite vezu na Reddit API

Sigurnost Vrh

Upravo sam najavio novi tečaj Learn Spring Security, uključujući puni materijal usredotočen na novi OAuth2 stog u Spring Security 5:

>> PROVJERITE TEČAJ OSTALO Vrh

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Pregled

U ovom drugom članku serije izradit ćemo jednostavnu funkcionalnost za objavljivanje na Redditu iz naše aplikacije putem njihovog API-ja.

2. Potrebna sigurnost

Prvo - maknimo sigurnosni aspekt.

Da bi Pošaljite vezu na Reddit, moramo definirati resurs zaštićen OAuthom s opseg od “podnijeti“:

@Bean public OAuth2ProtectedResourceDetails reddit () {AuthorizationCodeResourceDetails detalji = novi AuthorizationCodeResourceDetails (); detalji.setId ("reddit"); details.setClientId (clientID); details.setClientSecret (clientSecret); details.setAccessTokenUri (accessTokenUri); details.setUserAuthorizationUri (userAuthorizationUri); detalji.setTokenName ("oauth_token"); details.setScope (Arrays.asList ("identitet", "pošalji")); details.setGrantType ("autorizacijski kod"); detalji povrata; }

Imajte na umu da navodimo i opsegidentitet”Jer također trebamo pristupiti podacima o korisničkom računu.

3. Je li potreban Captcha?

Korisnici koji su novi u Redditu morate ispuniti captcha radi podnošenja; to je prije nego što prijeđu određeni prag karme unutar Reddita.

Za ove korisnike prvo moramo provjeriti je li potrebna Captcha:

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

4. "Pošalji post”Obrazac

Dalje, izradimo glavni obrazac za slanje novih postova na Reddit. Slanje veze zahtijeva sljedeće detalje:

  • titula - naslov članka
  • url - URL članka
  • subreddit - podredit na koji se šalje veza

Pa da vidimo kako možemo prikazati ovu jednostavnu stranicu za prijavu:

@RequestMapping ("/ post") javni niz showSubmissionForm (model modela) baca JsonProcessingException, IOException {String needsCaptchaResult = needsCaptcha (); if (needsCaptchaResult.equalsIgnoreCase ("true")) {Niz iden = getNewCaptcha (); model.addAttribute ("iden", iden); } return "submitForm"; }

I naravno osnovno submitForm.html:

 Funkcija objavljivanja submitPost () {var data = {}; $ ('obrazac'). serializeArray (). map (function (x) {data [x.name] = x.value;}); $ .ajax ({url: "api / posts", data: JSON.stringify (data), type: 'POST', contentType: 'application / json'}). done (funkcija (podaci) {if (data.length <2) {alert (podaci [0]);} else {window.location.href = "submitResponse? Msg =" + podaci [0] + "& url =" + podaci [1];}}). Neuspjeh (funkcija (pogreška) {alert (error.responseText);}); } 

5. Pošaljite vezu na Reddit

Sada - pogledajmo posljednji korak - slanje stvarne veze putem Reddit API-ja.

OBJAVIĆEM zahtjev za slanje na Reddit koristeći parametre iz našeg obrazac za predaju:

@Controller @RequestMapping (value = "/ api / posts") javna klasa RedditPostRestController {@Autowired privatna usluga RedditService; @RequestMapping (method = RequestMethod.POST) @ResponseBody javni popis predati (@Valid @RequestBody PostDto postDto) {return service.submitPost (postDto); }}

Evo stvarne implementacije metode:

javni popis submitPost (PostDto postDto) {MultiValueMap param1 = constructParams (postDto); JsonNode čvor = redditTemplate.submitPost (param1); vratiti parseResponse (čvor); } privatni MultiValueMap constructParams (PostDto postDto) {MultiValueMap param = novi LinkedMultiValueMap (); param.add ("naslov", 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 ("vrsta", "veza"); param.add ("ponovno poslati", "istinito"); param.add ("zatim", "komentari"); povratni parametar; }

I jednostavna logika raščlanjivanja, rukovanje odgovorom iz Reddit API-ja:

privatni popis parseResponse (čvor JsonNode) {Rezultat niza = ""; JsonNode errorNode = node.get ("json"). Get ("pogreške"). Get (0); if (errorNode! = null) {for (JsonNode child: errorNode) null "," ") +"

"; return Arrays.asList (rezultat);} else {if ((node.get (" json "). get (" data ")! = null) && (node.get (" json "). get (" podaci ") .get (" url ")! = null)) {return Arrays.asList (" Post je uspješno poslan ", node.get (" json "). get (" data "). get (" url "). asText ());} else {return Arrays.asList ("Došlo je do pogreške prilikom raščlanjivanja odgovora");}}}

Sa svim ovim se radi osnovni DTO:

javni razred PostDto {@NotNull privatni naslov niza; @NotNull private String url; @NotNull privatni niz subreddit; privatni logički sendReplies; privatni niz iden; captcha privatnog niza; }

Napokon - submitResponse.html:

zdravo

zdravo

Ovdje

6. Zaključak

U ovom smo brzom vodiču implementirali neke osnovne stvari Predajte Redditu funkcionalnost - pojednostavljena, ali potpuno funkcionalna.

U sljedećem dijelu ove studije slučaja implementirat ćemo a Zakažite objavu za kasnije funkcionalnost u našoj aplikaciji.

The puna provedba ovog vodiča možete pronaći u projektu github - ovo je projekt zasnovan na Eclipseu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.

Dno sigurnosti

Upravo sam najavio novi tečaj Learn Spring Security, uključujući puni materijal usredotočen na novi OAuth2 stog u Spring Security 5:

>> PROVJERITE TEČAJ OSTALO dno

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ