बुनियादी प्रमाणीकरण के लिए एक सही प्राधिकरण शीर्ष लेख कैसे भेजें


100

मैं अपने एपीआई से डेटा पोस्ट करने की कोशिश कर रहा हूं, लेकिन मैं मूल प्रमाणीकरण पारित नहीं कर सकता।

मैं कोशिश करूँगा:

$.ajax({
  type: 'POST',
  url: http://theappurl.com/api/v1/method/,
  data: {},
  crossDomain: true,
  beforeSend: function(xhr) {
    xhr.setRequestHeader('Authorization', 'Basic [REDACTED]');
  }
});

मेरा सर्वर कॉन्फ़िगरेशन प्रतिक्रिया है:

response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Methods"] = "POST"
response["Access-Control-Max-Age"] = "1000"
response["Access-Control-Allow-Headers"] = "*"

मुझे जो हेडर मिलते हैं वह हैं:

अनुरोध हेड

OPTIONS /api/v1/token-auth/ HTTP/1.1
Host: theappurl.com
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://127.0.0.1:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31
Access-Control-Request-Headers: origin, authorization, content-type
Accept: */*
Referer: http://127.0.0.1:8080/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: es,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

रिस्पांस हेडर

HTTP/1.1 401 Unauthorized
Server: nginx/1.1.19
Date: Fri, 16 Aug 2013 01:29:21 GMT
Content-Type: text/html
Content-Length: 597
Connection: keep-alive
WWW-Authenticate: Basic realm="Restricted"

मुझे लगता है कि सर्वर कॉन्फ़िगरेशन अच्छा है क्योंकि मैं उन्नत REST क्लाइंट से API तक पहुंच सकता हूं (क्रोम एक्सटेंशन)

कोई सुझाव?

PD: शीर्ष लेख जो मुझे उन्नत REST क्लाइंट से मिलता है:

    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31
    Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
    Authorization: Basic [REDACTED]
    Content-Type: application/x-www-form-urlencoded 
    Accept: */*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: es,en;q=0.8
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

तथा

    Server: nginx/1.1.19 
    Date: Fri, 16 Aug 2013 01:07:18 GMT 
    Content-Type: application/json; charset=utf-8 
    Transfer-Encoding: chunked 
    Connection: keep-alive
    Vary: Accept, Cookie 
    Allow: POST, OPTIONS 
    X-Robots-Tag: noindex

विकल्प विधि भेजना


19
मुझे लगता है कि यह पद लंबे समय से मृत है, लेकिन मैं सिर्फ यह बताना चाहता हूं कि यदि आप अपने प्राधिकरण: हेडर को पोस्ट करके नहीं जानते हैं, तो आपने अनिवार्य रूप से अपना पासवर्ड स्पष्ट में पोस्ट किया है। जिबरिश का तार सिर्फ आपके उपयोगकर्ता नाम: पासवर्ड का आधार 64 एन्कोडिंग है, जिससे हर कोई आपका पासवर्ड देख सकता है। उम्मीद है कि आपको इस बात का अहसास हो गया होगा और
उन्होंने

यह ssrs रिपोर्ट सर्वर 2017 के साथ ठीक काम करता है। यह URL में पासवर्ड और उपयोगकर्ता नाम छिपाता है।
क्लार्क वेरा

@Lexelby: उपयोगकर्ता नाम "उपयोगकर्ता" और पासवर्ड स्पेनिश में "और पासवर्ड" है। इसलिए मैं अनुमान लगा रहा हूं कि ये असली प्रमाणिकता नहीं हैं।
पीडीआर

जवाबों:


48

आप उपयोगकर्ता और पासवर्ड को URL के भाग के रूप में शामिल कर सकते हैं:

http://user:passwd@www.server.com/index.html

इस URL को और देखें

HTTP बेसिक ऑथेंटिकेशन क्रेडेंशियल URL और एन्क्रिप्शन में पास हुआ

बेशक, आपको उपयोगकर्ता नाम पासवर्ड की आवश्यकता होगी, यह नहीं है 'Basic hashstring

उम्मीद है की यह मदद करेगा...


6
यह समाधान Android के मूल ब्राउज़र (प्री किटकैट) के लिए काम नहीं करेगा। उपयोगकर्ता नाम / लॉगिन फ़ॉर्म अभी भी आपके उपयोगकर्ता के लिए पॉपअप होगा, इसलिए सावधान रहें।
स्टर्लिंग बॉर्न

58
यह विधि नेटवर्क या उपकरणों पर सुनने वाले किसी भी व्यक्ति के उपयोगकर्ता नाम और पासवर्ड को उजागर करती है ...
एडम

5
@ अदम हैश स्ट्रिंग भी सुरक्षित नहीं है
मुस्तफा

38
इस सवाल का जवाब बिल्कुल नहीं है। इसे url के रूप में पास करना हेडर नहीं है।
जेमलोइ

5
downvote कारण: developer.mozilla.org/en-US/docs/Web/HTTP/Authentication । लेख के अंत की ओर, इसमें उल्लेख किया गया है किThe use of these URLs is deprecated
aurupr

70

प्रति https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding और http://en.wikipedia.org/wiki/Basn_access_authentication , यहाँ बताया गया है कि कैसे एक हेडर के बजाय बेसिक करें। URL में उपयोगकर्ता नाम और पासवर्ड डालने की। ध्यान दें कि यह अभी भी उपयोगकर्ता या पासवर्ड को नेटवर्क या इस जेएस कोड तक पहुंच से नहीं छिपाता है (उदाहरण के लिए एक ब्राउज़र में इसे निष्पादित करने वाला उपयोगकर्ता):

$.ajax({
  type: 'POST',
  url: http://theappurl.com/api/v1/method/,
  data: {},
  crossDomain: true,
  beforeSend: function(xhr) {
    xhr.setRequestHeader('Authorization', 'Basic ' + btoa(unescape(encodeURIComponent(YOUR_USERNAME + ':' + YOUR_PASSWORD))))
  }
});

1
नोट: IE6,7,8,9 में काम करने के लिए इस सुविधा के लिए Base64.js जैसे एक window.btoa पॉलीफ़िल की आवश्यकता होगी। इसके अलावा unescape को ECMAScript v3 के अनुसार हटा दिया गया है।
null

@Techbrunch आप गलत हैं, seanp2k का उदाहरण बहुत अच्छी तरह से काम करता है, यह यूनिकोड वर्णों को ASCII में डिकोड करने के लिए एक बहुत ही ज्ञात ट्रिक का उपयोग करता है, यह वास्तव में इस तथ्य का उपयोग करता है कि (संयुक्त राष्ट्र) एस्केप यूनिकोड का समर्थन नहीं करता है, लेकिन (dec)

40

NodeJS उत्तर:

यदि आप इसे NodeJS के साथ करना चाहते हैं: Authorizationहेडर के साथ JSON एंडपॉइंट के लिए एक GET बनाएं और प्राप्त करेंPromise वापस :

प्रथम

npm install --save request request-promise

( npm पर देखें ) और फिर आपकी .jsफ़ाइल में:

var requestPromise = require('request-promise');

var user = 'user';
var password = 'password';

var base64encodedData = new Buffer(user + ':' + password).toString('base64');

requestPromise.get({
  uri: 'https://example.org/whatever',
  headers: {
    'Authorization': 'Basic ' + base64encodedData
  },
  json: true
})
.then(function ok(jsonData) {
  console.dir(jsonData);
})
.catch(function fail(error) {
  // handle error
});

1
धन्यवाद, आपने मेरा दिन बचा लिया :)
Sparw

धन्यवाद, इसने मेरे रिएक्शन एप्लिकेशन में काम किया जिसमें "fetch" का उपयोग किया गया
MohsenFM

13

यदि आप एक ब्राउज़र वातावरण में हैं, तो आप btoa का उपयोग भी कर सकते हैं ।

btoaएक फ़ंक्शन है जो एक स्ट्रिंग को तर्क के रूप में लेता है और एक बेस 64 एनकोडिंग एएससीआईआई स्ट्रिंग का उत्पादन करता है। इसका 97% ब्राउज़रों ने समर्थन किया है

उदाहरण:

> "Basic " + btoa("billy"+":"+"secretpassword")
< "Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ="

इसके बाद आप जोड़ सकते हैं Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=करने के लिए authorizationशीर्ष लेख।

ध्यान दें कि HTTP बेसिक ऑर्टिफिकेशन के बारे में सामान्य कैविएट, सबसे महत्वपूर्ण बात अगर आप अपने ट्रैफ़िक को https पर नहीं भेजते हैं, तो एक ईवेंटस्प्रॉप्ड बस बेस 64 एनकोडेड स्ट्रिंग को डिकोड कर सकता है, इस प्रकार आपका पासवर्ड प्राप्त होता है।

यह security.stackexchange.com उत्तर कुछ डाउनसाइड्स का अच्छा अवलोकन देता है।


3

URL के भाग के रूप में उपयोगकर्ता और पासवर्ड का उपयोग करने की आवश्यकता नहीं है

आप यह कोशिश कर सकते हैं

byte[] encodedBytes = Base64.encodeBase64("user:passwd".getBytes());

String USER_PASS = new String(encodedBytes);

HttpUriRequest request = RequestBuilder.get(url).addHeader("Authorization", USER_PASS).build();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.