জাভাতে এইচটিপিপি বেসিক অথেনটিকেশন এইচটিপিপিলেট ব্যবহার করে?


156

আমি জাভাতে এই কার্ল কমান্ডটির কার্যকারিতা অনুকরণ করার চেষ্টা করছি:

curl --basic --user username:password -d "" http://ipaddress/test/login

আমি কমন্স এইচটিটিপিপ্লায়েন্ট 3.0 ব্যবহার করে নিম্নলিখিতটি লিখেছি তবে কোনওরকম 500 Internal Server Errorসার্ভার থেকে একটি পেয়ে শেষ হয়েছিল । কেউ আমাকে বলতে পারে আমি কিছু ভুল করছি কিনা?

public class HttpBasicAuth {

    private static final String ENCODING = "UTF-8";

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {

            HttpClient client = new HttpClient();

            client.getState().setCredentials(
                    new AuthScope("ipaddress", 443, "realm"),
                    new UsernamePasswordCredentials("test1", "test1")
                    );

            PostMethod post = new PostMethod(
                    "http://address/test/login");

            post.setDoAuthentication( true );

            try {
                int status = client.executeMethod( post );
                System.out.println(status + "\n" + post.getResponseBodyAsString());
            } finally {
                // release any connection resources used by the method
                post.releaseConnection();
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
   } 

এবং পরে আমি একটি কমন্স এইচটিপিপ্লেইন্ট ৪.০.১ চেষ্টা করেছি কিন্তু এখনও একই ত্রুটি:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;


public class HttpBasicAuth {

    private static final String ENCODING = "UTF-8";

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        try {
            DefaultHttpClient httpclient = new DefaultHttpClient();

            httpclient.getCredentialsProvider().setCredentials(
                    new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), 
                    new UsernamePasswordCredentials("test1", "test1"));

            HttpPost httppost = new HttpPost("http://host:post/test/login");

            System.out.println("executing request " + httppost.getRequestLine());
            HttpResponse response;
            response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();

            System.out.println("----------------------------------------");
            System.out.println(response.getStatusLine());
            if (entity != null) {
                System.out.println("Response content length: " + entity.getContentLength());
            }
            if (entity != null) {
                entity.consumeContent();
            }

            httpclient.getConnectionManager().shutdown();  
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

ওম, সার্ভার লগগুলিতে প্রদর্শিত ত্রুটিটি কী?
hvgotcodes

আহ ... সার্ভার লগগুলিতে আমার অ্যাক্সেস নেই :(
লেজেন্ড

বেশিরভাগ সময় আমরা যে অনুমোদন কীটি ব্যবহার করি তা ভুল হতে পারে। পরীক্ষা করে দেখুন dev.tapjoy.com/faq/how-to-find-sender-id-and-api-key-for-gcm আপনার সঠিক কী ব্যবহার করছেন বা না দেখতে। ফায়ারবেসের জন্য এপিআই কী নির্বাচন করার সময় আমি বিভ্রান্ত হয়ে পড়েছিলাম ফায়ারবেস সেটিংয়ের আওতায় ক্লাউড মেসেজিং ট্যাবে SENDER ID - API KEY জোড়া ব্যবহার করতে হবে। অর্থাত্ ফায়ারবেস অ্যাপে যান -> অ্যাপ সেটিংসে যান -> ক্লাউড মেসেজিং আপনি সেখানে প্রেরক আইডি <==> এপিআই কী এবং এই এপিআই কীটি পেতে পারেন যা আপনি এফসিএম প্রেরণে ব্যবহার করতে পারেন।
রাহুল

উত্তর:


187

আপনি কি এটি চেষ্টা করেছেন (এইচটিটিপিপ্লায়েন্ট 4 ব্যবহার করে):

String encoding = Base64Encoder.encode(user + ":" + pwd);
HttpPost httpPost = new HttpPost("http://host:post/test/login");
httpPost.setHeader(HttpHeaders.AUTHORIZATION, "Basic " + encoding);

System.out.println("executing request " + httpPost.getRequestLine());
HttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();

64
java.util.Base64জাভা 8 হিসাবে ব্যবহার করা আরও ভাল :Base64.getEncoder().encodeToString(("test1:test1").getBytes());
মাইকেল বেরি

1
আমি বেস 64, হেক্স এবং অন্যান্য রূপান্তর থেকে রূপান্তর করতে javax.xML.bind.DatatypeConverter ব্যবহার করতে পছন্দ করি। এটি jdk এর একটি অংশ তাই কোনও অতিরিক্ত জেআর অন্তর্ভুক্ত করার দরকার নেই।
মুবাশার

1
এটি হ'ল এই সংস্করণটি আমার ব্যবহারের ক্ষেত্রে আমার পক্ষে কাজ করে যেখানে এইচটিটিপিএক্লিয়েন্ট ইতিমধ্যে সরবরাহ করা হয়েছে এবং আপনি httpclient তৈরি করার সময় আপনি বিল্ডারে setDefaultCredentialsProvider () সেট করতে পারবেন না। এছাড়াও আমি এটি পছন্দ করি কারণ এটি প্রতি কল স্কোপ। পুরো httpclient সুযোগে নয়।
টনি

114

ঠিক আছে সুতরাং এটি কাজ করে। যে কোনও ক্ষেত্রে এটি চাইলে এখানে আমার জন্য কাজ করা সংস্করণটি এখানে আছে:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Base64;


public class HttpBasicAuth {

    public static void main(String[] args) {

        try {
            URL url = new URL ("http://ip:port/login");
            String encoding = Base64.getEncoder().encodeToString(("test1:test1").getBytes(‌"UTF‌​-8"​));

            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setDoOutput(true);
            connection.setRequestProperty  ("Authorization", "Basic " + encoding);
            InputStream content = (InputStream)connection.getInputStream();
            BufferedReader in   = 
                new BufferedReader (new InputStreamReader (content));
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
        } catch(Exception e) {
            e.printStackTrace();
        }

    }

}

4
খুঁজে পাচ্ছি না Base64Encoder। জোনাস আপনি পুরো জার দিতে পারেন? এছাড়াও সম্পূর্ণ যোগ্য শ্রেণীর নাম কি Base64Encoder?
Jus12

@ অমিতাভ: এখানেBase64Encoder দেখুন । অ্যাপাচি এইচটিটিপি কম্পোনেন্টস ডাউনলোডস , ডক ,Base64import org.apache.commons.codec.binary.Base64;
4.2.5.zip

22
এটি প্রশ্নের উত্তর দেয় না। প্রশ্নটি HTTPClient ব্যবহার সম্পর্কে জিজ্ঞাসা করে এবং এই উত্তরটি HTTPClient ব্যবহার করে না।
পল ক্রোয়ারকিন

9
আপনি যদি জাভা 8 ব্যবহার করছেন তবে আপনি java.util.Base64 ব্যবহার করতে পারেন।
ডাব্লুডাব্লু

4
Java.util.Base64String encoding = Base64.getEncoder().encodeToString("test1:test1".getBytes("utf-8"));
জো

16

বেস 64 টি এনকোডিং সম্পর্কিত কিছু পরিবর্তন সহ উপরের স্বীকৃত উত্তর থেকে এই কোড। নীচের কোডটি সংকলন করে।

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import org.apache.commons.codec.binary.Base64;


public class HttpBasicAuth {

    public static void main(String[] args) {

        try {
            URL url = new URL ("http://ip:port/login");

            Base64 b = new Base64();
            String encoding = b.encodeAsString(new String("test1:test1").getBytes());

            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setDoOutput(true);
            connection.setRequestProperty  ("Authorization", "Basic " + encoding);
            InputStream content = (InputStream)connection.getInputStream();
            BufferedReader in   = 
                new BufferedReader (new InputStreamReader (content));
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
        } 
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}

14

একটি ছোট আপডেট - কারও পক্ষে আশাকরি কার্যকর - এটি আমার প্রকল্পে আমার জন্য কাজ করে:

  • আমি রবার্ট হার্ডার থেকে বেস পাবলিক ডোমেন ক্লাস বেস 64.java ব্যবহার করি (ধন্যবাদ রবার্ট - কোড এখানে পাওয়া যায়: বেস 64 ) এটি ডাউনলোড করে আপনার প্যাকেজে রাখুন)।

  • এবং প্রমাণীকরণের সাথে একটি ফাইল (চিত্র, ডক, ইত্যাদি) ডাউনলোড করুন এবং স্থানীয় ডিস্কে লিখুন

উদাহরণ:

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpBasicAuth {

public static void downloadFileWithAuth(String urlStr, String user, String pass, String outFilePath) {
    try {
        // URL url = new URL ("http://ip:port/download_url");
        URL url = new URL(urlStr);
        String authStr = user + ":" + pass;
        String authEncoded = Base64.encodeBytes(authStr.getBytes());

        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        connection.setDoOutput(true);
        connection.setRequestProperty("Authorization", "Basic " + authEncoded);

        File file = new File(outFilePath);
        InputStream in = (InputStream) connection.getInputStream();
        OutputStream out = new BufferedOutputStream(new FileOutputStream(file));
        for (int b; (b = in.read()) != -1;) {
            out.write(b);
        }
        out.close();
        in.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}
}

2
আমি পেয়েছিThe method encodeBytes(byte[]) is undefined for the type Base64
ফ্রান্সিসকো Corrales

কাস্টম বেস 64 ক্লাস এই পৃষ্ঠায় এই উত্তরimport org.apache.commons.codec.binary.Base64; হিসাবে বিস্তারিত
ব্র্যাড পার্ক

3
জাভা 8 এ, আপনি ব্যবহার করতে পারেন: java.util.Base64 আমদানি করুন;
ডাব্লুডাব্লু

7

এখানে কয়েকটি বিষয় রয়েছে:

  • আপনি এইচটিপিপিলেট 4 এ আপগ্রেড করার কথা বিবেচনা করতে পারেন (সাধারণভাবে বলতে গেলে, আপনি যদি পারেন তবে আমি মনে করি না সংস্করণ 3 এখনও সক্রিয়ভাবে সমর্থিত)।

  • একটি 500 স্থিতি কোড একটি সার্ভার ত্রুটি, তাই সার্ভারটি কী বলে (আপনি যে প্রতিক্রিয়ার মুদ্রণটি মুদ্রণ করছেন তার কোনও ক্লু?) তা দেখতে কার্যকর হতে পারে। যদিও এটি আপনার ক্লায়েন্টের কারণে হতে পারে, তবে সার্ভারটি এভাবে ব্যর্থ হবে না (যদি অনুরোধটি ভুল হয় তবে একটি 4xx ত্রুটি কোড আরও উপযুক্ত হবে)।

  • আমি মনে করি setDoAuthentication(true)ডিফল্ট (নিশ্চিত নয়)। প্রাক-অ্যাক্টিভ প্রমাণীকরণ আরও ভাল কাজ করে যা চেষ্টা করতে দরকারী হতে পারে:

    client.getParams().setAuthenticationPreemptive(true);

অন্যথায়, curl -d ""আপনি জাভাতে যা করছেন তার মধ্যে প্রধান পার্থক্য হ'ল Content-Length: 0, কার্ল এছাড়াও প্রেরণ করে Content-Type: application/x-www-form-urlencoded। নোট করুন যে ডিজাইনের ক্ষেত্রে আপনার সম্ভবত POSTঅনুরোধের সাথে কোনও সত্তা প্রেরণ করা উচিত ।


5

উপরের সমস্ত উত্তরের জন্য ধন্যবাদ, তবে আমার জন্য, আমি বেস 64 এনকোডার শ্রেণিটি খুঁজে পাচ্ছি না, তাই আমি যাইহোক আমার উপায়টি বাছাই করি।

public static void main(String[] args) {
    try {
        DefaultHttpClient Client = new DefaultHttpClient();

        HttpGet httpGet = new HttpGet("https://httpbin.org/basic-auth/user/passwd");
        String encoding = DatatypeConverter.printBase64Binary("user:passwd".getBytes("UTF-8"));
        httpGet.setHeader("Authorization", "Basic " + encoding);

        HttpResponse response = Client.execute(httpGet);

        System.out.println("response = " + response);

        BufferedReader breader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        StringBuilder responseString = new StringBuilder();
        String line = "";
        while ((line = breader.readLine()) != null) {
            responseString.append(line);
        }
        breader.close();
        String repsonseStr = responseString.toString();

        System.out.println("repsonseStr = " + repsonseStr);

    } catch (IOException e) {
        e.printStackTrace();
    }

}

আরও একটি বিষয়, আমি চেষ্টাও করেছি

Base64.encodeBase64String("user:passwd".getBytes());

এটি প্রায় একই সাথে একটি স্ট্রিং ফিরে আসার কারণে এটি কাজ করে না

DatatypeConverter.printBase64Binary()

তবে "\ r \ n" দিয়ে শেষ করুন, তারপরে সার্ভার "খারাপ অনুরোধ" প্রত্যাবর্তন করবে।

নীচের কোডটিও কাজ করছে, আসলে আমি প্রথমে এটিকে বাছাই করি তবে কোনও কারণে এটি কিছু মেঘের পরিবেশে কাজ করে না (sae.sina.com.cn যদি আপনি জানতে চান, এটি একটি চীনা মেঘ পরিষেবা)। সুতরাং HTTPClient শংসাপত্রগুলির পরিবর্তে HTTP শিরোনাম ব্যবহার করতে হবে।

public static void main(String[] args) {
    try {
        DefaultHttpClient Client = new DefaultHttpClient();
        Client.getCredentialsProvider().setCredentials(
                AuthScope.ANY,
                new UsernamePasswordCredentials("user", "passwd")
        );

        HttpGet httpGet = new HttpGet("https://httpbin.org/basic-auth/user/passwd");
        HttpResponse response = Client.execute(httpGet);

        System.out.println("response = " + response);

        BufferedReader breader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        StringBuilder responseString = new StringBuilder();
        String line = "";
        while ((line = breader.readLine()) != null) {
            responseString.append(line);
        }
        breader.close();
        String responseStr = responseString.toString();
        System.out.println("responseStr = " + responseStr);

    } catch (IOException e) {
        e.printStackTrace();
    }
}

Base64.encodeBase64String ( "ব্যবহারকারী: passwd কোন" .getBytes ()); আমার জন্য কাজ। ডেটাটাইপকোনভার্টার.প্রিন্টবেস 64 বাইনারি () আমার পক্ষেও কাজ করেছিল। এটি এমন হতে পারে যে আপনি আগের বার্তায় বার্তাগুলির কোনও ভুল করেছেন এবং এটি একটি খারাপ অনুরোধের কারণ হয়েছে। অথবা এটি সার্ভারের উপর নির্ভর করে।
ভাড়া

5

শিরোনাম অ্যারে ব্যবহার করার সময়

String auth = Base64.getEncoder().encodeToString(("test1:test1").getBytes());
Header[] headers = {
    new BasicHeader(HTTP.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString()),
    new BasicHeader("Authorization", "Basic " +auth)
};

3

এইচটিটিপিপ্লায়েন্টের জন্য সর্বদা উদাহরণস্বরূপ HttpRequestInterceptor ব্যবহার করুন

httclient.addRequestInterceptor(new HttpRequestInterceptor() {
    public void process(HttpRequest arg0, HttpContext context) throws HttpException, IOException {
        AuthState state = (AuthState) context.getAttribute(ClientContext.TARGET_AUTH_STATE);
        if (state.getAuthScheme() == null) {
            BasicScheme scheme = new BasicScheme();
            CredentialsProvider credentialsProvider = (CredentialsProvider) context.getAttribute(ClientContext.CREDS_PROVIDER);
            Credentials credentials = credentialsProvider.getCredentials(AuthScope.ANY);
            if (credentials == null) {
                System.out.println("Credential >>" + credentials);
                throw new HttpException();
            }
            state.setAuthScope(AuthScope.ANY);
            state.setAuthScheme(scheme);
            state.setCredentials(credentials);
        }
    }
}, 0);

3

এইচটিটিপিবাসিকআউথ আমার সাথে ছোট ছোট পরিবর্তনগুলি নিয়ে কাজ করে

  1. আমি মাভেন নির্ভরতা ব্যবহার করি

    <dependency>
        <groupId>net.iharder</groupId>
        <artifactId>base64</artifactId>
        <version>2.3.8</version>
    </dependency>
  2. ছোট পরিবর্তন

    String encoding = Base64.encodeBytes ((user + ":" + passwd).getBytes());

1

কোনও বেস 64 নির্দিষ্ট কল না করেই এইচটিটিপি পোষ্টের সাথে লগইন করার একটি সহজ উপায় হল এইচটিটিপি ক্লায়েন্ট বেসিক ক্রেডিট্যান্সিয়াল প্রোভিডার ব্যবহার করা

import java.io.IOException;
import static java.lang.System.out;
import org.apache.http.HttpResponse;
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.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.HttpClientBuilder;

//code
CredentialsProvider provider = new BasicCredentialsProvider();
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(user, password);
provider.setCredentials(AuthScope.ANY, credentials);
HttpClient client = HttpClientBuilder.create().setDefaultCredentialsProvider(provider).build();

HttpResponse response = client.execute(new HttpPost("http://address/test/login"));//Replace HttpPost with HttpGet if you need to perform a GET to login
int statusCode = response.getStatusLine().getStatusCode();
out.println("Response Code :"+ statusCode);

এটি আমার জন্য কাজ করছে না। কলটি কাজ করে তবে কোনও প্রমাণীকরণ শিরোনাম উপস্থিত নেই।
lukas84

অদ্ভুত, আপনার সরবরাহকারীর সঠিকভাবে সেট করা আছে?
rjdkolb

আপনার লাইব্রেরির সংস্করণ আপডেট করার চেষ্টা করুন। এটি আমার জন্য কাজ করেছিল
rjdkolb
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.