আমার বেসিক লেখার সাহায্যে অনুমোদনের অনুরোধ পাঠাতে হবে। আমি jquery ব্যবহার করে এটি সফলভাবে প্রয়োগ করেছি। তবে আমি যখন 401 ত্রুটি পেয়েছি মৌলিক লেখক ব্রাউজারের পপআপ খোলা হয় এবং জ্যাকোরি এজাক্স ত্রুটি কলব্যাক কল করা হয় না।
আমার বেসিক লেখার সাহায্যে অনুমোদনের অনুরোধ পাঠাতে হবে। আমি jquery ব্যবহার করে এটি সফলভাবে প্রয়োগ করেছি। তবে আমি যখন 401 ত্রুটি পেয়েছি মৌলিক লেখক ব্রাউজারের পপআপ খোলা হয় এবং জ্যাকোরি এজাক্স ত্রুটি কলব্যাক কল করা হয় না।
উত্তর:
আমি খুব সম্প্রতি এই সমস্যাটির মুখোমুখি হয়েছি। যেহেতু আপনি কোনও 401
( বেসিক বা ডাইজেস্ট প্রমাণীকরণ) ক্ষেত্রে পপআপ দেখানোর ব্রাউজারের ডিফল্ট আচরণটি পরিবর্তন করতে পারবেন না , তাই এটি ঠিক করার দুটি উপায় রয়েছে:
401
। 200
পরিবর্তে একটি কোড ফেরত দিন এবং আপনার jQuery ক্লায়েন্টে এটি পরিচালনা করুন।আপনি অনুমোদনের জন্য যে পদ্ধতিটি ব্যবহার করছেন তা আপনার শিরোনামের একটি কাস্টম মানতে পরিবর্তন করুন। ব্রাউজারগুলি বেসিক এবং ডাইজেস্টের পপআপ প্রদর্শন করবে । আপনাকে এটি ক্লায়েন্ট এবং সার্ভার উভয় ক্ষেত্রেই পরিবর্তন করতে হবে।
headers : {
"Authorization" : "BasicCustom"
}
এছাড়াও কটাক্ষপাত করা অনুগ্রহ করে এই বুনিয়াদি প্রমাণীকরণ সঙ্গে jQuery ব্যবহার একটি উদাহরণ জন্য।
<security:http-basic/>
আপনাকে ব্যবহার করার সময় সংজ্ঞা দেওয়ার দরকার নেই basicAuthenticationFilter
তবে এটি হিসাবে সংজ্ঞা দেওয়া উচিত <security:http-basic entry-point-ref="myBasicAuthenticationEntryPoint"/>
।
401
WWW-Authenticate:Bearer WWW-Authenticate:NTLM WWW-Authenticate:Negotiate
একটি জেনেরিক 400 স্ট্যাটাস কোডটি ফিরিয়ে দিন এবং তারপরে সেই ক্লায়েন্টের পাশ দিয়ে প্রক্রিয়া করুন।
অথবা আপনি 401 রাখতে পারেন এবং ডাব্লুডাব্লুডাব্লু-প্রমাণীকরণ শিরোনামটি ফিরিয়ে দিতে পারবেন না, যা সত্যিকারের ব্রাউজারটি প্রমাণীকরণ পপআপ দিয়ে সাড়া দিচ্ছে। যদি ডাব্লুডাব্লুডাব্লু-প্রমাণী শিরোনাম অনুপস্থিত থাকে, তবে ব্রাউজারটি শংসাপত্রগুলির জন্য অনুরোধ জানাবে না।
res.removeHeader('www-authenticate'); // prevents browser from popping up a basic auth window.
অনুরোধ url এর মতো দেখতে আপনি বুনিয়াদি লেখক পপআপকে দমন করতে পারেন:
https://username:password@example.com/admin/...
যদি আপনি 401 ত্রুটি (ভুল ব্যবহারকারী নাম বা পাসওয়ার্ড) পান তবে এটি jquery ত্রুটি কলব্যাক দিয়ে সঠিকভাবে পরিচালনা করা হবে। এটি কিছু সুরক্ষা সমস্যা সৃষ্টি করতে পারে (https এর পরিবর্তে HTTP প্রোটোকলের ক্ষেত্রে), তবে এটি কার্যকর।
ইউপিডি: ক্রোম 59-এ এই সমাধান সমর্থনটি সরানো হবে
https://user:pass@host/
জুন ২০১ around এর আশেপাশে সমর্থন ছাড়বে more আরও তথ্যের জন্য এই ক্রোমস্ট্যাটাস ব্লগ পোস্টটি দেখুন।
অন্যরা যেমন উল্লেখ করেছে, ব্রাউজারের আচরণ পরিবর্তন করার একমাত্র উপায় হ'ল শিরোনামটি অন্তর্ভুক্ত না করে এটির প্রতিক্রিয়াটি 401 স্থিতি কোডটি না রয়েছে কিনা তা নিশ্চিত করা WWW-Authenticate: Basic
। যেহেতু স্থিতি কোডটি পরিবর্তন করা খুব সিনমেটিক এবং অবাঞ্ছিত নয়, তাই একটি ভাল পদ্ধতির নাম অপসারণ করাWWW-Authenticate
শিরোনামটি । আপনি যদি নিজের ওয়েব সার্ভার অ্যাপ্লিকেশনটি সংশোধন করতে বা না করতে চান তবে আপনি সর্বদা এটি অ্যাপাচি (যদি আপনি ইতিমধ্যে অ্যাপাচি ব্যবহার না করে থাকেন) এর মাধ্যমে পরিবেশন করতে বা প্রক্সি করতে পারেন।
ডাব্লুডাব্লুডাব্লু-প্রমাণীকরণ শিরোলেখ অপসারণ করার জন্য অ্যাপাচি-র প্রতিক্রিয়াটি পুনরায় লেখার জন্য এখানে একটি কনফিগারেশন রয়েছে IFF অনুরোধটিতে শিরোনাম রয়েছে X-Requested-With: XMLHttpRequest
(যা মূলত জাভাস্ক্রিপ্ট ফ্রেমওয়ার্ক যেমন জিকুয়েরি / অ্যাংুলারজেএস ইত্যাদির দ্বারা সেট করা আছে ...) এবং প্রতিক্রিয়াটিতে রয়েছে হেডার WWW-Authenticate: Basic
।
অ্যাপাচি ২.৪-তে পরীক্ষা করা হয়েছে (এটি 2.2 এর সাথে কাজ করে কিনা তা নিশ্চিত নয়)। এটি mod_headers
ইনস্টল করা মডিউলটির উপর নির্ভর করে । (ডেবিয়ান / উবুন্টুতে sudo a2enmod headers
এবং অ্যাপাচি পুনরায় চালু করুন)
<Location />
# Make sure that if it is an XHR request,
# we don't send back basic authentication header.
# This is to prevent the browser from displaying a basic auth login dialog.
Header unset WWW-Authenticate "expr=req('X-Requested-With') == 'XMLHttpRequest' && resp('WWW-Authenticate') =~ /^Basic/"
</Location>
proxy_hide_header WWW-Authenticate;
এক্স-রিকুয়েস্টড-সহ: আপনার অনুরোধ শিরোনামের সাথে এক্সএমএলএইচটিটিপিআরকেস্ট ব্যবহার করুন। সুতরাং প্রতিক্রিয়া শিরোনামে WWW- প্রমাণীকরণ: বেসিক থাকবে না।
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', ("Basic "
.concat(btoa(key))));
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
},
আপনি একটি আইআইএস সার্ভার ব্যবহার করেন, তাহলে আপনি সেটআপ আইআইএস URL টি rewriting (v2) পুনর্লিখন পারে WWW-Authentication
থেকে হেডার None
অনুরোধ করা URL উপর।
আপনি যে মানটি পরিবর্তন করতে চান তা হ'ল response_www_authenticate
।
আপনার যদি আরও তথ্যের প্রয়োজন হয় তবে একটি মন্তব্য যুক্ত করুন এবং আমি ওয়েবকনফিগ ফাইলটি পোস্ট করব।
যদি ডাব্লুডাব্লুডাব্লু-প্রমাণী শিরোনাম সরানো হয়, তবে আপনি শংসাপত্রগুলির ক্যাচিং পাবেন না এবং অনুরোধে অনুমোদন শিরোনামটি ফিরে পাবেন না। তার অর্থ এখন আপনার উত্পন্ন প্রতিটি নতুন অনুরোধের শংসাপত্রগুলি প্রবেশ করতে হবে।
বিকল্পভাবে, আপনি যদি নিজের সার্ভারের প্রতিক্রিয়াটি কাস্টমাইজ করতে পারেন তবে আপনি একটি 403 নিষিদ্ধ ফিরিয়ে দিতে পারেন।
ব্রাউজারটি প্রমাণীকরণ পপআপটি খুলবে না এবং jquery কলব্যাক কল করা হবে।
সাফারিতে, আপনি পপআপ প্রদর্শন করতে ব্রাউজারটিকে এড়াতে সিঙ্ক্রোনাস অনুরোধগুলি ব্যবহার করতে পারেন। অবশ্যই সিঙ্ক্রোনাস অনুরোধগুলি ব্যবহারকারীর শংসাপত্রগুলি যাচাই করার জন্য কেবল এই ক্ষেত্রে ব্যবহার করা উচিত ... আপনি প্রকৃত অনুরোধটি প্রেরণের আগে এমন অনুরোধটি ব্যবহার করতে পারেন যা সামগ্রীটি (প্রেরিত বা প্রাপ্ত) যথেষ্ট ভারী হলে খারাপ ব্যবহারকারীর অভিজ্ঞতার কারণ হতে পারে।
var xmlhttp=new XMLHttpRequest;
xmlhttp.withCredentials=true;
xmlhttp.open("POST",<YOUR UR>,false,username,password);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
GET এর মাধ্যমে "ব্যবহারকারী" এবং "পাসওয়ার্ড" পরামিতি গ্রহণ করার চেয়ে একটি / লগইন ইউআরএল তৈরি করুন এবং বেসিক লেখার প্রয়োজন নেই। এখানে, পিএইচপি, নোড, জাভা, যা কিছু ব্যবহার করুন এবং আপনার পাসডওডি ফাইলকে পার্স করুন এবং এর বিপরীতে ম্যাচ প্যারামিটারগুলি (ব্যবহারকারী / পাস) করুন। যদি কোনও মিল থাকে তবে http: // ব্যবহারকারী: pass@domain.com/ এ পুনঃনির্দেশ করুন (এটি আপনার ব্রাউজারে শংসাপত্র স্থাপন করবে) যদি না হয় তবে 401 প্রতিক্রিয়া ( ডাব্লুডাব্লুডাব্লু -প্রমাণীকরণ শিরোনাম ছাড়াই) প্রেরণ করুন।
স্প্রিং বুটের সাথে পিছনের দিক থেকে আমি কাস্টম বেসিকঅথেন্টিকেশন এন্ট্রিপয়েন্টটি ব্যবহার করেছি:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and().authorizeRequests()
...
.antMatchers(PUBLIC_AUTH).permitAll()
.and().httpBasic()
// https://www.baeldung.com/spring-security-basic-authentication
.authenticationEntryPoint(authBasicAuthenticationEntryPoint())
...
@Bean
public BasicAuthenticationEntryPoint authBasicAuthenticationEntryPoint() {
return new BasicAuthenticationEntryPoint() {
{
setRealmName("pirsApp");
}
@Override
public void commence
(HttpServletRequest request, HttpServletResponse response, AuthenticationException authEx)
throws IOException, ServletException {
if (request.getRequestURI().equals(PUBLIC_AUTH)) {
response.sendError(HttpStatus.PRECONDITION_FAILED.value(), "Wrong credentials");
} else {
super.commence(request, response, authEx);
}
}
};
}