उपयोगकर्ता लॉगिन रीस्ट प्रारूप


13

क्या किसी के पास Drupal 8 पर काम करने वाला REST लॉगिन है?

यही मैंने कोशिश की।

POST /user/login HTTP/1.1
Host: 8.d8.local
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: http://nikhilmohan.in
Cache-Control: no-cache

name=test&pass=password&form_id=user_login_form

यह JSON के बजाय मुझे HTML लौटाता है ।

जवाबों:


15

8.2 से घूर, Drupal कुकी प्रमाणीकरण के लिए json एंडपॉइंट का समर्थन करता है। अब आपको फॉर्म पोस्ट करने की आवश्यकता नहीं है the

curl --header "Content-type: application/json" --request POST \
  --data '{"name":"admin", "pass":"admin"}' \
http://drupal.d8/user/login?_format=json

आउटपुट जैसा दिखेगा

{"current_user":{"uid":"1","roles":["authenticated","administrator"],"name":"admin"},"csrf_token":"wBr9ldleaUhmP4CgVh7PiyyxgNn_ig8GgAan9-Ul3Lg","logout_token":"tEulBvihW1SUkrnbCERWmK2jr1JEN_mRAQIdNNhhIDc"}

परिवर्तन रिकॉर्ड: https://www.drupal.org/node/2720655

अन्य प्रमाणीकरण विधियाँ: https://www.drupal.org/docs/8/core/modules/rest/use-other-authentication-protocols


मुझे यह काम करने के लिए नहीं मिल सकता है, मुझे 403 मिलता है "यह मार्ग केवल अनाम उपयोगकर्ताओं द्वारा ही पहुँचा जा सकता है।" अजीब के रूप में मैं बाकी उपयोग कर रहा हूँ स्पष्ट रूप से लॉग इन नहीं
जिम स्मिथ

1
@jimsmith आप कॉल का परीक्षण करने के लिए क्या उपयोग कर रहे हैं? मुझे पोस्टमैन का उपयोग करने से पहले यह समस्या हुई है क्योंकि यह मेरे क्रोम कुकीज़ को प्राप्त कर रहा था और कह रहा था कि मैं लॉग इन था। आप इसे ब्राउज़र में लॉग आउट करके और फिर से अनुरोध भेजकर इसका परीक्षण कर सकते हैं
Antero Duarte

12

यहाँ आप Drupal 8 REST के लिए जावास्क्रिप्ट के माध्यम से कैसे लॉगिन कर सकते हैं:

Drupal 8.2 और उससे आगे

  • पोस्ट :http://example.com/user/login?_format=json
  • सामग्री-प्रकार :application/json
  • डेटा :{ "name": "admin", "pass": "myPassword" }
  • प्रतिक्रिया :200 OK

यह कुकी प्रमाणीकरण के माध्यम से ठीक से लॉगिन करेगा, और इसके समान परिणाम लौटाएगा:

{
  "current_user": {
    "uid":"1",
    "roles":["authenticated"],
    "name":"admin"
  },
  "csrf_token":"abc123",
  "logout_token":"def456"
}

मैंने एक कंट्रिब मॉड्यूल बनाया है जिसे jDrupal कहा जाता है जिससे जावास्क्रिप्ट (अन्य चीजों के साथ) लॉगिन करना बहुत आसान हो जाता है:

// Login and show the user their id.
jDrupal.userLogin('admin', 'myPassword').then(function() {
  alert(jDrupal.currentUser().id());
});

Drupal से पहले 8.2

  • पोस्ट :http://example.com/user/login
  • सामग्री-प्रकार :application/x-www-form-urlencoded
  • डेटा :name=admin&pass=myPassword&form_id=user_login_form
  • प्रतिक्रिया :200 OK | 303 See Other

आप URL में डेटा को क्वेरी स्ट्रिंग के रूप में भेजेंगे। परिणाम HTML होगा, इसलिए यह आपके लिए उपयोगी कुछ भी नहीं लौटाएगा, लेकिन यह कुकी प्रमाणीकरण के माध्यम से ठीक से लॉगिन करेगा।


तो HTML लौटना अपरिहार्य है?
निकम्मेक

इस बिंदु पर AFAIK, हाँ HTML अपरिहार्य है। मुझे लगता है कि यह समय के साथ बेहतर हो जाएगा, क्योंकि उदाहरण के लिए REST के माध्यम से उपयोगकर्ता को पंजीकृत करने का कोई तरीका नहीं है, लेकिन एक मुद्दा बनाया गया है।
tyler.frankenstein

यह मेरे लिए काम नहीं कर रहा है, यह आवश्यक है कि बुनियादी प्रमाणीकरण का उपयोग करें?
युसेफ

FYI करें, JSON को Drupal 8.2 के रूप में लौटाया जाता है, इसलिए अधिक HTML नहीं लौटाया जाता है।
tyler.frankenstein

8
  1. एक HTTP अनुरोध सामग्री-प्रकार पर आधारित RESTful नहीं है।
  2. " REST लॉगिन " तकनीकी रूप से एक ऑक्सीमोरोन है।

रेस्टफुल ऑथेंटिकेशन का अर्थ है प्रत्येक अनुरोध के साथ प्रमाणीकरण भेजना क्योंकि यह स्टेटलेस है। Drupal 8 कोर द्वारा प्रदान किया गया उदाहरण बेसिक ऑथेंट मॉड्यूल है, जो बेसिक HTTP ऑथेंटिकेशन के जरिए HTTP रिक्वेस्ट के लिए ऑथेंटिकेशन क्रेडेंशियल भेजने की अनुमति देता है, जिसमें यूजर को GET के जरिए कॉन्टेंट एक्सेस करने की अनुमति मिलती है।

उत्साहपूर्ण उदाहरण

कर्ल: curl -vvv -k -H "Authorization: Basic test:password" http://8.d8.local/node/1?_format=json

GET /node/1?_format=json HTTP/1.1
Host: 8.d8.local
User-Agent: curl/7.43.0
Accept: */*
Authorization: Basic test:password

हालांकि यह आमतौर पर पर्याप्त अच्छा नहीं है। Simple_oauth और OAuth योगदान मॉड्यूल क्रमशः OAuth 2 और 1 समर्थन प्रदान करते हैं।, जिसके साथ एक HTTP अनुरोध OAuth प्रमाणीकरण के साथ बनाया जा सकता है पर OAuth काम उन मॉड्यूल में वर्णित प्रवाह आधारित टोकन।

लेकिन असली सवाल यही लगता है

मैं वेब सेवा एपीआई के माध्यम से कैसे लॉगिन करूं?

ऐसा करने के लिए एक स्थिर Drupal 8 मॉड्यूल नहीं है, लेकिन सेवा मॉड्यूल गैर-रिस्टफुल कार्यों और लक्षित कार्यों जैसे "लॉगिन" बनाने के लिए तरीके प्रदान करता है।

"एपीआई" नामक एक समापन बिंदु स्थापित करने के बाद निम्नलिखित काम करता है:

कर्ल: curl -vvv -k -H "Content-Type: application/json" -H "Accept: application/json" -d '{"username": "test", "password": "password"}' http://8.d8.local/api/user/login

POST /api/user/login HTTP/1.1
Host: 8.d8.local
Accept: application/json
Content-Type: application/json
Content-Length: 44

{"username": "test", "password": "password"}

यह JSON सेशन आईडी और नाम देता है (प्रतिक्रिया के सेट-कुकी हेडर में भी)।

और भी आप निम्नलिखित स्निपेट के साथ जेकरी अजाक्स कॉल के साथ लॉगिन कर सकते हैं

$.ajax({
    url : "http://gttc.dd:8083/user/login",
    type : 'post',
    data : 'form_id=user_login_form&name=' + encodeURIComponent("username") + '&pass=' + encodeURIComponent("password"),
    dataType : 'json',
    error : function(data) {
            //error code
    },
    success : function(data) {
      console.log(data);
        //success code
    }
});

सेवाएं शांत लगती हैं, हालांकि डी 8 आईएमओ में ड्रुपल कोर गड़बड़ है। अभी बहुत कुछ आना बाकी है।
निकम्मेक

1
Drupal 8.2 के बाद से आप drupal.stackexchange.com/a/221045/13237
andeersg

4

Drupal Core वर्जन: 8.x-4.x

आपको पहले उपयोगकर्ता लॉगिन सेवा को सक्षम करने की आवश्यकता है, यह इतने सारे तरीकों से पूरा हो सकता है, मैं REST UI मॉड्यूल का उपयोग करना पसंद करता हूं ।

जाने के लिए / व्यवस्थापक / config / सेवाओं / बाकी और सक्षम उपयोगकर्ता बाकी संसाधन।

एक बार सक्षम होने के बाद आप उपयोगकर्ता संसाधन के बगल में संपादित करें पर क्लिक करके / व्यवस्थापक / कॉन्फ़िगरेशन / सेवाओं / बाकी / संसाधन / इकाई% 3Auser / संपादित पर जा सकते हैं । GET विधि को सक्षम करने के लिए सुनिश्चित करें

यहाँ छवि विवरण दर्ज करें

अब आपके पास सब कुछ सेटअप है, आप टर्मिनल में इस कमांड को चलाकर या कर्ल अनुरोध जैसे पोस्टमैन और रेस्टलेट ग्राहकों के लिए किसी भी एप्लिकेशन का उपयोग करके सेवा का उपयोग शुरू कर सकते हैं।

नोट : CSRF टोकन से प्राप्त किया जा सकता है: / बाकी / सत्र / टोकन

curl -i -L -X POST \
  -H "Content-Type:application/json" \
  -H "Accept:application/json" \
  -H "X-CSRF-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
  -d \
     '{
       "name": "my_username",
       "pass": "my_password"
     }' \
'http://SITE-URL/user/login?_format=json'

वापसी की वस्तुएँ निम्नानुसार हैं:

सफलता :

{
  "current_user": {
  "uid": "1",
    "roles": [
      "authenticated"
    ],
    "name": "Admin"
  },
  "csrf_token": "bbbbbbbbbbbbbbbbbbbbbbbbbb",
  "logout_token": "ccccccccccccccccccccccccc"
}

विफलता :

{
  "message":"Sorry, unrecognized username or password."
}

> / व्यवस्थापक / कॉन्फ़िगरेशन / सेवाओं / आराम पर जाएं और उपयोगकर्ता आराम संसाधन को सक्षम करें । मुझे लगता है कि आपको REST एपि के साथ लॉग इन करने के लिए उपयोगकर्ता संसाधन को सक्षम करने की आवश्यकता नहीं है। यदि आप उपयोगकर्ता इकाई पर CRUD कार्रवाई करना चाहते हैं, तो इस संसाधन को सक्षम करना आवश्यक है। बाकी की अपी के साथ लॉग इन किया जा सकता है जैसा कि @ tyler.frankenstein
MutantMahesh

2

मैं drupal 8 पर कस्टम RESTFul लॉगिन का उपयोग करता हूं लेकिन कुकी के साथ नहीं। यह एक मोबाइल ऐप के लिए है और हर बार मुझे जानकारी की आवश्यकता होती है, मैं एक साधारण प्रमाणीकरण का उपयोग करता हूं:

Drupal 8.2x के बाद से हमें एक मॉड्यूल में 2 फाइलें चाहिए:

rest.ressource.user.rest_ressource.yml कॉन्फ़िगर / स्थापित फ़ोल्डर में

langcode: en
status: true
dependencies:
  module:
    - basic_auth
id: user.rest_ressource
plugin_id: 'user_rest_ressource'
granularity: resource
configuration:
  methods:
    - GET
    - PATCH
  formats:
    - json
  authentication:
    - basic_auth

आप DELETE / POST जैसे और भी तरीके जोड़ सकते हैं

फिर हमें फ़ाइल की आवश्यकता है

userRestRessource.php में src / Plugin / rest / resource

    <?php

    namespace Drupal\yourmodule\Plugin\rest\resource;

    use Drupal\Core\Session\AccountProxyInterface;
    use Drupal\rest\Plugin\ResourceBase;
    use Drupal\rest\ResourceResponse;
    use Symfony\Component\DependencyInjection\ContainerInterface;
    use Psr\Log\LoggerInterface;


    /**
     * Provides a resource to get view modes by entity and bundle.
     *
     * @RestResource(
     *   id = "user_rest_ressource",
     *   label = @Translation("User Rest"),
     *   uri_paths = {
     *     "canonical" = "/api/user/getInfo"
     *   }
     * )
     */
    class UserRestRessource extends ResourceBase {

      /**
       * A current user instance.
       *
       * @var \Drupal\Core\Session\AccountProxyInterface
       */
      protected $currentUser;

      /**
       * Constructs a Drupal\rest\Plugin\ResourceBase object.
       *
       * @param array $configuration
       *   A configuration array containing information about the plugin instance.
       * @param string $plugin_id
       *   The plugin_id for the plugin instance.
       * @param mixed $plugin_definition
       *   The plugin implementation definition.
       * @param array $serializer_formats
       *   The available serialization formats.
       * @param \Psr\Log\LoggerInterface $logger
       *   A logger instance.
       * @param \Drupal\Core\Session\AccountProxyInterface $current_user
       *   A current user instance.
       */
      public function __construct(
        array $configuration,
        $plugin_id,
        $plugin_definition,
        array $serializer_formats,
        LoggerInterface $logger,
        AccountProxyInterface $current_user) {
        parent::__construct($configuration, $plugin_id, $plugin_definition, $serializer_formats, $logger);

        $this->currentUser = $current_user;

      }

      /**
       * {@inheritdoc}
       */
      public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
        return new static(
          $configuration,
          $plugin_id,
          $plugin_definition,
          $container->getParameter('serializer.formats'),
          $container->get('logger.factory')->get('yourmodulename'),
          $container->get('current_user')
        );
      }

      /**
       * Responds to GET requests.
       *
       * Returns a list of bundles for specified entity.
       *
       * @throws \Symfony\Component\HttpKernel\Exception\HttpException
       *   Throws exception expected.
       */
      public function get() {

          $uid=$this->currentUser->getAccount()->id();
          $role=$this->currentUser->getAccount()->getRoles(1);

//here you can add your custom code
 $responseResource=new ResourceResponse(
          array()

      );
        return $responseResource;
      }

        /**
         * Responds to PATCH requests.
         *
         * Returns a list of bundles for specified entity.
         *
         * @throws \Symfony\Component\HttpKernel\Exception\HttpException
         *   Throws exception expected.
         */
        public function patch(){

        }

    }

GET / POST या आपके द्वारा अपने कॉन्फ़िगरेशन में जोड़े गए किसी भी तरीके को स्वीकार करने के लिए उपयोगकर्ता के पास जाना न भूलें।

इसके साथ आप प्रत्येक कस्टम इकाई के लिए प्रत्येक कस्टम REST फ़ाइल बना सकते हैं।

और मेरे जे एस में: कॉल करने के लिए मत भूलना

yoursiteUrl / बाकी / सत्र / टोकन

टोकन पाने के लिए

$http({
            method: 'GET',
            url: 'siteUrl/api/user/getInfo?_format=json',
                          withCredentials:true,
                          headers: {
                                   'Content-Type': "application/hal+json",
                                   'X-CSRF-Token': token,
                                   'Authorization': 'Basic ' + btoa(user+':'+password),

                         },


                        }).then(function successCallback(response) {

                             return response;

                          }, function errorCallback(response) {
                              return false;

                          });

2

@ Tyler.frankenstein के उत्तर के बाद, यदि आप अजाक्स के साथ एक लॉगिन फ़ॉर्म लागू करना चाहते हैं, तो आप उदाहरण के लिए उपयोग कर सकते हैं।

1. एक सीएसआरएफ टोकन प्राप्त करें

हमें user/loginDrupal 8 API के समापन बिंदु पर एक POST अनुरोध करने की आवश्यकता है । इस समापन बिंदु (एक "गैर-सुरक्षित विधि" के रूप में माना जाता है) के लिए आवश्यक है कि आप एक CSRF टोकन भेजें।

पहला कदम rest/session/tokenसमापन बिंदु के लिए एक AJAX अनुरोध भेजकर इस टोकन को प्राप्त करना है :

var getCsrfToken = function(callback) {
    $.get(Drupal.url('rest/session/token'))
        .done(function (data) {
            var csrfToken = data;
            callback(csrfToken);
        });
}

ध्यान दें:

  • callbackपैरामीटर कॉलबैक फ़ंक्शन कि जब CSRF टोकन प्राप्त किए गए हो जाएगा कहा जाता हो जाएगा
  • हम Drupal.urlसाइट के आधार URL को प्राप्त करने के लिए फ़ंक्शन का उपयोग करते हैं

यह टोकन X-CSRF-Tokenहेडर के साथ भेजा जाना चाहिए ।

2. लॉगिन करें

निम्नलिखित HTML पर विचार करें:

<form id="login" method="post" action="" accept-charset="UTF-8">
    <div class="input-field">
        <input id="edit-name" name="name" type="text" class="validate">
        <label for="edit-name">Username or email address</label>
    </div>
    <div class="input-field">
        <input id="edit-pass" name="pass" type="password" class="validate">
        <label for="edit-pass">Password</label>
    </div>
    <p><a href="{{ url('user.pass') }}">Forgot your password?</a></p>
    <button type="submit" class="btn btn-default btn-submit">Sign in</button>
</form>

... और इसी jQuery कोड:

$('form#login').on('submit', function(e) {
    e.preventDefault();

    var inputUsername = $('#edit-name').val();
    var inputPassword = $('#edit-pass').val();

    if (inputUsername != '' && inputPassword != '') {
        getCsrfToken(function(csrfToken) {
            $.ajax({
                url: Drupal.url('user/login?_format=json'),
                type: 'POST',
                dataType: 'json',
                data: JSON.stringify({name: inputUsername, pass: inputPassword}),
                headers: {
                    'X-CSRF-Token': csrfToken
                },
            }).done(function(response) {
                if (response.current_user) {
                    console.log('The user is logged!');
                }
            }).fail(function(jqXHR, textStatus) {
                ...
            });
        });
    }
});

इस कोड का Drupal 8.3 के साथ सफल परीक्षण किया गया है।

उम्मीद है इससे आपको मदद मिलेगी!


0

हाँ यकीन है, मैंने एक ब्लॉग बनाया कि इसे पोस्टमैन के साथ कैसे परीक्षण किया जाए , और यह भी कि आपके ड्रुपल साइट को कैसे कॉन्फ़िगर किया जाए ।

इस परियोजना में मैंने कोणीय के साथ Drupal के लिए लॉगिन बनाया, टोकन के लिए सरल OAuth मॉड्यूल का उपयोग किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.