জাভা ব্যবহার করে প্রমাণীকরণের প্রয়োজন এমন প্রত্যন্ত URL এ সংযোগ স্থাপন Connect


125

জাভাতে আমি কোনও দূরবর্তী ইউআরএলকে কীভাবে সংযুক্ত করব যার প্রমাণীকরণের প্রয়োজন। আমি নিম্নলিখিত কোডটি সংশোধন করার উপায়টি চেষ্টা করার চেষ্টা করছি যাতে প্রোগ্রামক্রমে ব্যবহারকারী নাম / পাসওয়ার্ড সরবরাহ করতে সক্ষম হয় যাতে এটি 401 না ফেলে।

URL url = new URL(String.format("http://%s/manager/list", _host + ":8080"));
HttpURLConnection connection = (HttpURLConnection)url.openConnection();

এখানে যাচাই করুন: স্ট্যাকওভারফ্লো.com
জিজ্ঞাসা

উত্তর:


134

আপনি এই জাতীয় http অনুরোধের জন্য ডিফল্ট প্রমাণীকরণকারী সেট করতে পারেন:

Authenticator.setDefault (new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication ("username", "password".toCharArray());
    }
});

এছাড়াও, যদি আপনার আরও নমনীয়তার প্রয়োজন হয় তবে আপনি অ্যাপাচি এইচটিটিপি ক্লায়েন্টটি পরীক্ষা করে দেখতে পারেন যা আপনাকে আরও প্রমাণীকরণের বিকল্প দেয় (পাশাপাশি সেশন সমর্থন ইত্যাদি) give


4
আপনি কীভাবে কোনও খারাপ প্রমাণীকরণ ইভেন্ট পরিচালনা করবেন? [উদাহরণস্বরূপ, যদি ব্যবহারকারী ব্যবহারকারীর নাম এবং পাসওয়ার্ডের প্রমাণীকরণের শংসাপত্রগুলি সরবরাহ করে যা কোনও কিছুর সাথে মেলে না]?
এসকে 9

2
উপরের কোডটি কাজ করে তবে যা চলছে তা পুরোপুরি অন্তর্নিহিত। সেখানে সাবক্লাসিং এবং পদ্ধতি ওভাররাইডিং চলছে, কী চলছে তা যদি আপনি যত্ন করে দেখেন তবে এই ক্লাসগুলির জন্য ডক্সটি খনন করুন। কোড এখানে আরো স্পষ্ট হয় javacodegeeks
Fuchida

12
বিশ্বব্যাপী সেট করার পরিবর্তে Authenticatorনির্দিষ্ট নির্দিষ্ট URL.openConnection()অনুরোধে নির্দিষ্ট সেট করা কি সম্ভব ?
ইউরি নাকনটেকায়ি

@ ইউরা: না। এটি বিশ্বব্যাপী হতে পারে। আপনি যাইহোক, এমন কোনও খারাপ কাজ করতে পারেন যেমন একটি বিশ্বব্যাপী প্রমাণীকরণকারীর সেট করা যা থ্রেড-লোকাল ভেরিয়েবলগুলির শংসাপত্রগুলি সরিয়ে দেয় এবং এইচটিটিপি সংযোগ করার আগে থ্রেডে শংসাপত্রগুলি সেট করে।
ডেভিড

4
@ ইউরি নাকনটেকনির জবাবে ... আপনি যদি জাভা 9 বা তার বেশি ব্যবহার করছেন তবে আপনি কল করতে পারবেন HttpURLConnection.setAuthenticator()। দুর্ভাগ্যক্রমে জাভা 8 এবং তার আগে, প্রমাণীকরণকারী উদাহরণটি একটি JVM- প্রশস্ত বিশ্বব্যাপী পরিবর্তনশীল। দেখুন: docs.oracle.com/javase/9/docs/api/java/net/…
নীল বার্টলেট

133

একটি নেটিভ এবং কম অনুপ্রবেশকারী বিকল্প রয়েছে, যা কেবলমাত্র আপনার কলের জন্য কাজ করে।

URL url = new URL(“location address”);
URLConnection uc = url.openConnection();
String userpass = username + ":" + password;
String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes()));
uc.setRequestProperty ("Authorization", basicAuth);
InputStream in = uc.getInputStream();

5
বেস 64 ক্লাসটি অ্যাপাচি কমন্স কোডেক সরবরাহ করতে পারে।
ম্যাথু বালকেট

আমার পক্ষে এইভাবে কাজ করেনি ... @ জামেস ভ্যান হুইস যেভাবে ভাল ছিল কেবল সেই পথেই
মিগুয়েল রিবেইরো

এটি গ্রিলস এবং অন্যান্য অনেক জাভা ফ্রেমওয়ার্কগুলিতে 'নেটিভ' কারণ তারা সকলেই অ্যাপাচি কমন্স ল্যাব ব্যবহার করে।
ওয়ান্ডারসন সান্টোস

1
আপনি .trim()ফলাফল না পাওয়া বা সাধারণ পদ্ধতিতে কাজ করে না এমন কোনও পদ্ধতিকে কল করুন যা ছাঁটাই আউটপুট উত্পাদন করে না। javax.xml.bind.DatatypeConverterনিরাপদ বলে মনে হচ্ছে
জেসি গ্লিক

আমি এই উত্তরে আপনার কোডটি উদ্ধৃত করে দিয়েছি ধন্যবাদ
নোটস- jj

77

আপনি নিম্নলিখিতগুলিও ব্যবহার করতে পারেন, যার জন্য বাহ্যিক প্যাকেজগুলি ব্যবহার করার প্রয়োজন নেই:

URL url = new URL(“location address”);
URLConnection uc = url.openConnection();

String userpass = username + ":" + password;
String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes());

uc.setRequestProperty ("Authorization", basicAuth);
InputStream in = uc.getInputStream();

10
আমি এতদিন জাভা স্ট্যান্ডার্ড প্যাকেজগুলির মধ্যে একটি বেস 64 এনকোডারটি খুঁজছি! আপনাকে ধন্যবাদ
qwertzguy

নোট করুন যে জাভা 9 + এর জন্য আপনাকে সম্ভবত --add-modules javax.xml.bindডিফল্ট ক্লাসপথ থেকে প্যাকেজটি সরিয়ে ফেলতে হবে। এবং জাভা 11 + এ এটি পুরোপুরি সরিয়ে ফেলা হয়েছে, আপনার আবার একটি বাহ্যিক নির্ভরতা প্রয়োজন। এমনই অগ্রগতি!
এড র‌্যান্ডাল

1
@ এডরানডাল java.util.Base64এখনই আছে তাই এটি আসলেই অগ্রগতি :)
স্টিভেন শ্ল্যাঙ্কার

42

প্রোটোকল এবং ডোমেনের মধ্যে ব্যবহারকারীর নাম এবং পাসওয়ার্ড প্রবেশের সময় আপনি যদি সাধারণ লগইন ব্যবহার করেন তবে এটি সহজ। এটি লগইন সহ এবং ছাড়াও কাজ করে।

নমুনা url: HTTP: // ব্যবহারকারী: pass@domain.com/url

URL url = new URL("http://user:pass@domain.com/url");
URLConnection urlConnection = url.openConnection();

if (url.getUserInfo() != null) {
    String basicAuth = "Basic " + new String(new Base64().encode(url.getUserInfo().getBytes()));
    urlConnection.setRequestProperty("Authorization", basicAuth);
}

InputStream inputStream = urlConnection.getInputStream();

কমেন্টে নোট করুন, ভ্যালারিবোডাক থেকে নীচে, কীভাবে এটি অ্যান্ড্রয়েড বিকাশের পরিবেশে হয়।


1
আমি গত ৩০ মিনিট ধরে ঠিক এটিই অনুসন্ধান করেছি। অনেক ধন্যবাদ!
গির্ট শিউরিং

আপনার ব্যবহারকারীর নাম / পাসওয়ার্ডে যদি বিশেষ অক্ষর থাকে তবে আমি বিশ্বাস করি যে আপনাকে এগুলি ইউলিংকোড করতে হবে। এর পরে, উপরে কোডের স্নিপেট, আপনি পাস হবে url.getUserInfo()thorugh URLDecoder.decode()প্রথম (@Peter Rader)।
m01

ধন্যবাদ, তবে অ্যান্ড্রয়েডের জন্য আপনার নিম্নোক্ত হিসাবে বেস 64৪ ব্যবহার করা উচিত: স্ট্রিং বেসিকলথ = "বেসিক" + বেস64.encodeToString (url.getUserInfo ()। getBytes (), বেস6464.DEFAULT); httpConn.setRequestProperty ("অনুমোদন", বেসিকআউথ);
ভ্যালারিবোডাক

আপনাকে পরিপূরক জন্য ভ্যালারিবোডাক ধন্যবাদ!
জাভাবেংরিন্দর

8

যেহেতু আমি এখানে একটি অ্যান্ড্রয়েড-জাভা-উত্তর সন্ধান করতে এসেছি আমি একটি সংক্ষিপ্ত সারাংশ করতে যাচ্ছি:

  1. Java.net.Authenticator ব্যবহার করুন যেমন জেমস ভ্যান হুইস দেখিয়েছে
  2. এই জবাব হিসাবে অ্যাপাচি কমন্স এইচটিটিপি ক্লায়েন্ট ব্যবহার করুন
  3. বেসিক java.net. URL সংযোগটি ব্যবহার করুন এবং এখানে দেখানো মতো ম্যানুয়ালি প্রমাণীকরণ-শিরোনাম সেট করুন

আপনি যদি java.net ব্যবহার করতে চান তবে অ্যান্ড্রয়েডে বেসিক প্রমাণীকরণের সাথে সংযোগ এই কোডটি ব্যবহার করে দেখুন:

URL url = new URL("http://www.mywebsite.com/resource");
URLConnection urlConnection = url.openConnection();
String header = "Basic " + new String(android.util.Base64.encode("user:pass".getBytes(), android.util.Base64.NO_WRAP));
urlConnection.addRequestProperty("Authorization", header);
// go on setting more request headers, reading the response, etc

1
ধন্যবাদ। একটি অ্যান্ড্রয়েড নির্দিষ্ট উত্তর খুঁজছিল!
স্টিফেন

5

এইচটিটিএসপিআরএল সংযোগটি ব্যবহার করে লেখককে সেট করতে সক্ষম হয়েছিল

           URL myUrl = new URL(httpsURL);
            HttpsURLConnection conn = (HttpsURLConnection)myUrl.openConnection();
            String userpass = username + ":" + password;
            String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes()));
            //httpsurlconnection
            conn.setRequestProperty("Authorization", basicAuth);

এই পোস্ট থেকে প্রাপ্ত কিছু পরিবর্তন। এবং বেস 64 java.util প্যাকেজ থেকে।


3

"বেস 64 ()। এনকোড ()" পদ্ধতির সাথে সত্যই সতর্ক থাকুন, আমার দল এবং আমি 400 অ্যাপাচি খারাপ অনুরোধের সমস্যা পেয়েছি কারণ এটি উত্পন্ন স্ট্রিংয়ের শেষে একটি \ r \ n যুক্ত করে।

আমরা এটি পাইছি প্যাকেটগুলি ওয়্যারশার্ককে ধন্যবাদ জানায়।

আমাদের সমাধানটি এখানে:

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

HttpGet getRequest = new HttpGet(endpoint);
getRequest.addHeader("Authorization", "Basic " + getBasicAuthenticationEncoding());

private String getBasicAuthenticationEncoding() {

        String userPassword = username + ":" + password;
        return new String(Base64.encodeBase64(userPassword.getBytes()));
    }

আশা করি এটা সাহায্য করবে!


3

বেসিক প্রমাণীকরণের জন্য এই কোডটি ব্যবহার করুন।

URL url = new URL(path);
String userPass = "username:password";
String basicAuth = "Basic " + Base64.encodeToString(userPass.getBytes(), Base64.DEFAULT);//or
//String basicAuth = "Basic " + new String(Base64.encode(userPass.getBytes(), Base64.No_WRAP));
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
urlConnection.setRequestProperty("Authorization", basicAuth);
urlConnection.connect();


2

আমি এই মামলার জন্য একটি উত্তর সরবরাহ করতে চাই যে সংযোগটি খোলার কোডটির উপরে আপনার নিয়ন্ত্রণ নেই। ব্যবহার করার সময় আমি যেমন করেছিURLClassLoader পাসওয়ার্ড সুরক্ষিত সার্ভার থেকে একটি জার ফাইল লোড করার ।

Authenticatorসমাধান কাজ কিন্তু অসুবিধা হল এটি প্রথম পাসওয়ার্ড ছাড়াই এবং শুধুমাত্র একটি পাসওয়ার্ড এক প্রদান করে সার্ভার জিজ্ঞেস পর সার্ভার পৌঁছাতে চেষ্টা করে হয়েছে হবে। এটি যদি আপনি ইতিমধ্যে জানতেন যে সার্ভারটির একটি পাসওয়ার্ডের প্রয়োজন হবে তবে এটি একটি অপ্রয়োজনীয় রাউন্ডট্রিপ।

public class MyStreamHandlerFactory implements URLStreamHandlerFactory {

    private final ServerInfo serverInfo;

    public MyStreamHandlerFactory(ServerInfo serverInfo) {
        this.serverInfo = serverInfo;
    }

    @Override
    public URLStreamHandler createURLStreamHandler(String protocol) {
        switch (protocol) {
            case "my":
                return new MyStreamHandler(serverInfo);
            default:
                return null;
        }
    }

}

public class MyStreamHandler extends URLStreamHandler {

    private final String encodedCredentials;

    public MyStreamHandler(ServerInfo serverInfo) {
        String strCredentials = serverInfo.getUsername() + ":" + serverInfo.getPassword();
        this.encodedCredentials = Base64.getEncoder().encodeToString(strCredentials.getBytes());
    }

    @Override
    protected URLConnection openConnection(URL url) throws IOException {
        String authority = url.getAuthority();
        String protocol = "http";
        URL directUrl = new URL(protocol, url.getHost(), url.getPort(), url.getFile());

        HttpURLConnection connection = (HttpURLConnection) directUrl.openConnection();
        connection.setRequestProperty("Authorization", "Basic " + encodedCredentials);

        return connection;
    }

}

এটি একটি নতুন প্রোটোকল রেজিস্ট্রেশন করে myযা httpশংসাপত্র যুক্ত হওয়ার সময় প্রতিস্থাপন করা হয় । সুতরাং নতুন তৈরি করার সময় এর সাথে URLClassLoaderপ্রতিস্থাপন করুন এবং সবকিছু ঠিক আছে। আমি জানি একটি কনস্ট্রাক্টর সরবরাহ করে যা গ্রহণ করেhttpmyURLClassLoaderURLStreamHandlerFactory তবে এই কারখানাটি ব্যবহার করা হয় না যদি URL টি জার ফাইলটিতে নির্দেশ করে।


1

জাভা 9, যেহেতু আপনি এটি করতে পারেন

URL url = new URL("http://www.example.com");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setAuthenticator(new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication ("USER", "PASS".toCharArray());
    }
});

2
setAuthenticator()পদ্ধতি দেখেনি ।
ওয়েস্টার্নগুন

0

অ্যান্ড্রয়েড ইমপ্লিমেন্টেশন ব্যবহারকারীর নাম এবং পাসওয়ার্ড সহ অনুমোদনের জন্য ওয়েব পরিষেবা থেকে ডেটা / স্ট্রিং প্রতিক্রিয়া অনুরোধ করার একটি সম্পূর্ণ পদ্ধতি

public static String getData(String uri, String userName, String userPassword) {
        BufferedReader reader = null;
        byte[] loginBytes = (userName + ":" + userPassword).getBytes();

        StringBuilder loginBuilder = new StringBuilder()
                .append("Basic ")
                .append(Base64.encodeToString(loginBytes, Base64.DEFAULT));

        try {
            URL url = new URL(uri);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.addRequestProperty("Authorization", loginBuilder.toString());

            StringBuilder sb = new StringBuilder();
            reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            while ((line = reader.readLine())!= null){
                sb.append(line);
                sb.append("\n");
            }

            return  sb.toString();

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            if (null != reader){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

0

আমি এই কাজটি করেছিলাম যাতে আপনার এটি করা দরকার কেবল কপি পেস্ট করুন এটি খুশি

    HttpURLConnection urlConnection;
    String url;
 //   String data = json;
    String result = null;
    try {
        String username ="danish.hussain@gmail.com";
        String password = "12345678";

        String auth =new String(username + ":" + password);
        byte[] data1 = auth.getBytes(UTF_8);
        String base64 = Base64.encodeToString(data1, Base64.NO_WRAP);
        //Connect
        urlConnection = (HttpURLConnection) ((new URL(urlBasePath).openConnection()));
        urlConnection.setDoOutput(true);
        urlConnection.setRequestProperty("Content-Type", "application/json");
        urlConnection.setRequestProperty("Authorization", "Basic "+base64);
        urlConnection.setRequestProperty("Accept", "application/json");
        urlConnection.setRequestMethod("POST");
        urlConnection.setConnectTimeout(10000);
        urlConnection.connect();
        JSONObject obj = new JSONObject();

        obj.put("MobileNumber", "+97333746934");
        obj.put("EmailAddress", "danish.hussain@mee.com");
        obj.put("FirstName", "Danish");
        obj.put("LastName", "Hussain");
        obj.put("Country", "BH");
        obj.put("Language", "EN");
        String data = obj.toString();
        //Write
        OutputStream outputStream = urlConnection.getOutputStream();
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
        writer.write(data);
        writer.close();
        outputStream.close();
        int responseCode=urlConnection.getResponseCode();
        if (responseCode == HttpsURLConnection.HTTP_OK) {
            //Read
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));

        String line = null;
        StringBuilder sb = new StringBuilder();

        while ((line = bufferedReader.readLine()) != null) {
            sb.append(line);
        }

        bufferedReader.close();
        result = sb.toString();

        }else {
        //    return new String("false : "+responseCode);
        new String("false : "+responseCode);
        }

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.