Programim dhe zhvillim, javascript, python, php, html

Autentifikimi bazë me RestTemplate (3.1)

Po përpiqem të riprodhoj komandën e mëposhtme curl duke përdorur Java:

curl -v -u user:pass http://myapp.com/api

Kjo komandë kthen disa të dhëna JSON.

Implementimi im me buggy Java është si më poshtë:

@Test
public void callTest() {
    RestTemplate restTemplate = createRestTemplate("user", "pass");
    URI uri = new URI("http://myapp.com/api");
    String res = restTemplate.getForObject(uri, String.class);
}

private static RestTemplate createRestTemplate(String username, String password) {

    UsernamePasswordCredentials cred = new UsernamePasswordCredentials(username, password);
    BasicCredentialsProvider cp = new BasicCredentialsProvider();
    cp.setCredentials(AuthScope.ANY, cred);
    DefaultHttpClient client = new DefaultHttpClient();
    client.setCredentialsProvider(cp);
    ClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(client);

    RestTemplate restTemplate = new RestTemplate(factory);
    // set the media types properly
    return restTemplate;
}

Megjithatë, kur unë ekzekutoj testin, ai kthen një përjashtim org.springframework.web.client.HttpClientErrorException: 401 Unauthorized.

Kur regjistrohem në DEBUG, nuk shoh asnjë informacion në lidhje me vërtetimin...

Çfarë po bëj gabim gjatë vendosjes së kredencialeve të vërtetimit?


Përgjigjet:


1

Instantues duke përdorur

HttpClient client = new HttpClient();

nuk ekziston më dhe klasa DefaultHttpClient është zhvlerësuar nga HttpComponents HttpClient nga versioni 4.3. Pra, përgjigjet e tjera janë ose të pavlefshme ose të zhvlerësuara. Këtu është versioni im, unë shkrova këtë klasë për kërkesat e pushimit që kërkojnë vërtetim bazë:

import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.HttpClients;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

public class RestClient extends RestTemplate {
    public RestClient(String username, String password) {
        CredentialsProvider credsProvider = new BasicCredentialsProvider();
        credsProvider.setCredentials(
                new AuthScope(null, -1),
                new UsernamePasswordCredentials(username, password));
        HttpClient httpClient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
        setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
    }
}

Pastaj përdorni atë si, për shembull:

RestClient restClient = new RestClient("username", "password");

String result = restClient.postForObject(...
08.12.2013
  • Faleminderit! E vetmja që punon (pa përdorur metoda të amortizuara) në këtë faqe për mua. 20.12.2013
  • Zgjerimi i RestTemplate për ta bërë këtë është qasja e gabuar. Konfigurojeni atë për të bërë atë që ju nevojitet (në konfigurimin Spring XML ose Java), në vend që ta nënklasoni atë. 18.02.2014
  • Shembull i bukur atje, pikë e mirë e bërë nga @TedPennings.. faleminderit të dyve. 27.03.2014
  • Unë tashmë po krijoja një RestTemplate sipas nevojës, kështu që nuk kisha nevojë të bëja nënklasë si kjo - thjesht përdora kodin e dhënë për të vendosur kredencialet e mia. Punë e mirë. 07.01.2015
  • E provova këtë zbatim për të POST në URL-në Jenkins buildWithParameters për një punë të caktuar dhe vazhdon të dështojë me një 403 që tregon se operacioni nuk funksionoi. Duke përdorur të njëjtën URL, përdorues dhe fjalëkalim me curl dhe kjo funksionon pa problem. Ndonjë të dhënë se pse kjo nuk funksionon? 11.06.2015

  • 2

    Unë bëj diçka të tillë - dhe ka funksionuar për mua:

    private RestTemplate createRestTemplate(String username, String password) {
        return new RestTemplate(this.createSecureTransport(username, password));
    }
    
    protected ClientHttpRequestFactory createSecureTransport(String username, String password){
        HttpClient client = new HttpClient();
        UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(username,password);
        client.getState().setCredentials(AuthScope.ANY, credentials);
        CommonsClientHttpRequestFactory commons = new CommonsClientHttpRequestFactory(client);
    
        return commons;
    }
    

    Përdoret këtu: Kodi i referencës

    18.01.2013
  • Kjo është me api-në e vjetër të HTTPClient. Unë përdor 4.x, në të cilin CommonsClientHttpRequestFactory nuk ekziston më. 18.01.2013

  • 3

    Kjo përgjigje bazohet në atë të @kevinpeterson, por me një rishkrim për të përdorur Klientin e përditësuar të Apache HTTP.

    RestTemplate createRestTemplate(String username, String password, String host, int port ) {
        return new RestTemplate(this.createSecureTransport( username, password, host, port ));
    }
    
    ClientHttpRequestFactory createSecureTransport( String username, String password, String host, int port ){
        DefaultHttpClient client = new DefaultHttpClient();
        UsernamePasswordCredentials credentials = new UsernamePasswordCredentials( username, password );
        client.getCredentialsProvider().setCredentials( new AuthScope( host, port ), credentials );
        return new HttpComponentsClientHttpRequestFactory(client);
    
    24.08.2013
  • Të paktën me Spring Framework 3.2.3 dhe httpclient 4.2.3, nuk munda ta bëja këtë kod më lart të funksiononte. E provova me të dyja AuthScope dhe AuthScope.ANY të specifikuara, por mendoj se nuk do të funksionojë. Lidhja nga Makoton shpjegon pse dhe ka një zgjidhje më të mirë. 12.09.2013
  • Nuk e di se çfarë problemi po përjetoni, por unë po e përdor këtë kod me sukses me Spring Framework 3.2.4 dhe httpclient 4.2.1. Dyshoj se dallimet e vogla të versioneve janë problemi, por kush e di. 12.09.2013

  • 4

    httpclient v4.0 nuk mbështet vërtetimin paraprak

    Shikoni këtë: http://forum.springsource.org/showthread.php?123385-Preemptive-Basic-Authentication-with-RestTemplate

    Në pranverë Burimi e gjeti këtë zgjidhje.

    Ajo funksionon për mua.

    Shikoni këtë: RestTemplate me Basic Auth në Spring 3.1

    25.03.2013
  • Asnjë nga përgjigjet e tjera nuk funksionoi për mua. E vetmja mënyrë që e bëra të funksiononte ishte përdorimi i vërtetimit parandalues. forum.spring.io/forum/ Spring-projects/web/ 23.04.2014
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..