ব্যবহারকারী লগইন REST ফর্ম্যাট


13

না কেউ একটি কাজ Drupal এর 8 বিশ্রাম লগইন?

এই আমি চেষ্টা করেছিলাম।

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

৮.২ থেকে দেখানো, দ্রুপাল কুকি প্রমাণীকরণের জন্য জসন এন্ডপয়েন্টগুলিকে সমর্থন করে। আপনাকে আর ফর্ম পোস্ট করার দরকার নেই 🎉

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/used-other-authentication-protocols


আমি এটি কাজ করতে পারি না, আমি 403 পাই "এই পথটি কেবল বেনাম ব্যবহারকারীদের দ্বারা অ্যাক্সেস করা যেতে পারে।" অদ্ভুত যেহেতু আমি REST ব্যবহার করছি স্পষ্টতই লগ ইন হয়নি
জিম স্মিথ

1
@ জিম্মিথ আপনি কলটি পরীক্ষা করতে কী ব্যবহার করছেন? আমি পিয়ন ব্যবহার করা হয়েছে কারণ এটি আমার Chrome কুকি পেয়ে ছিল এবং বলার অপেক্ষা রাখে না আমি লগ ইন করতে আগেই এই সমস্যা ছিল আপনি ব্রাউজারে লগ আউট এবং অনুরোধ আবার পাঠিয়ে এই পরীক্ষা করতে পারেন।
Antero দুয়ার্তে

12

ড্রুপাল 8 রিস্টের জন্য আপনি জাভাস্ক্রিপ্টের মাধ্যমে কীভাবে লগইন করতে পারেন তা এখানে:

ড্রুপাল ৮.২ এবং এর বাইরে

  • পোস্ট :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"
}

আমি জেড্রপাল নামে একটি অবদানের মডিউল তৈরি করেছি যা জাভাস্ক্রিপ্ট (অন্যান্য জিনিসের মধ্যে) দিয়ে লগইন করা খুব সহজ করে তোলে:

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

দ্রুপাল এর পূর্বে 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

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


তাই এইচটিএমএল ফেরানো অনিবার্য?
নিক্সম্যাক

এএফআইকে এই সময়ে, হ্যাঁ এইচটিএমএল অনিবার্য। আমি ভাবছিলাম সময়ের সাথে এটি আরও উন্নত হবে, কারণ উদাহরণস্বরূপ এখনও আরইএসটি-র মাধ্যমে কোনও ব্যবহারকারীকে নিবন্ধ করার উপায় নেই তবে একটি সমস্যা তৈরি হয়েছে।
tyler.frankenstein

এটি আমার পক্ষে কাজ করা হয়নি, বেসিক অথেনটিকেশনটিও কি প্রয়োজনীয়?
ইউসুফ

এফওয়াইআই, জেএসএন দ্রুপাল ৮.২ হিসাবে ফিরে আসে, সুতরাং আর কোনও এইচটিএমএল ফিরে আসে না।
tyler.frankenstein

8
  1. একটি HTTP অনুরোধ সামগ্রী-প্রকারের ভিত্তিতে বিশুদ্ধ নয়।
  2. " REST লগইন " প্রযুক্তিগতভাবে একটি অক্সিমারন।

RESTful অনুমোদনের অর্থ প্রতিটি অনুরোধের সাথে প্রমাণীকরণ পাঠানো কারণ এটি রাষ্ট্রবিহীন। ড্রুপাল 8 কোর দ্বারা সরবরাহিত উদাহরণটি বুনিক অথ মডিউল, যা কোনও ব্যবহারকারীকে জিইটি-র মাধ্যমে সামগ্রীতে অ্যাক্সেস করার অনুমতি প্রাপ্ত বেসিক এইচটিটিপি প্রমাণীকরণের মাধ্যমে HTTP অনুরোধের জন্য প্রমাণীকরণ শংসাপত্রগুলি প্রেরণ করতে দেয় allows

শান্ত উদাহরণ

কার্ল: 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 contrib মডিউল যথাক্রমে OAuth এর 2 এবং 1 সমর্থন প্রদান।, যা দিয়ে একটি HTTP অনুরোধ OAuth এর প্রমাণীকরণ দিয়ে তৈরি করা যেতে পারে OAuth এর কাজ মডিউলের বর্ণিত প্রবাহ ভিত্তিক টোকেন।

তবে আসল প্রশ্নটি মনে হচ্ছে

আমি কীভাবে কোনও ওয়েব পরিষেবাদি এপিআইয়ের মাধ্যমে লগইন করব?

এটি করার জন্য কোনও স্থিতিশীল ড্রুপাল 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
যেহেতু দ্রুপাল 8.2 আপনি drupal.stackexchange.com/a/221045/13237
এন্ডার্স্গে

4

ড্রুপাল কোর সংস্করণ: 8.x-4.x

আপনাকে প্রথমে ব্যবহারকারীর লগইন পরিষেবা সক্ষম করতে হবে, এটি অনেক উপায়ে সম্পন্ন হতে পারে, আমি REST UI মডিউলটি পছন্দ করি ।

টু গো / অ্যাডমিন / কনফিগ / পরিষেবাগুলি / বাকি এবং সক্ষম ব্যবহারকারী বিশ্রাম সম্পদ।

এটি সক্ষম হয়ে গেলে আপনি ব্যবহারকারীর সংস্থার পাশের সম্পাদনাতে ক্লিক করে / প্রশাসক / কনফিগারেশন / পরিষেবাদি / বিশ্রাম / সংস্থান / সত্তা% 3Auser / edit এ যেতে পারেন । জিইটি পদ্ধতি সক্ষম করার বিষয়টি নিশ্চিত করুন ।

এখানে চিত্র বর্ণনা লিখুন

এখন আপনার সবকিছু সেটআপ আছে, আপনি টার্মিনালে এই কমান্ডটি চালিয়ে বা কার্ল অনুরোধগুলির জন্য কোনও অ্যাপ্লিকেশন ব্যবহার করে: পোস্টম্যান এবং রিসলেট ক্লায়েন্ট ব্যবহার করে পরিষেবাটি ব্যবহার করতে শুরু করতে পারেন ।

দ্রষ্টব্য : সিএসআরএফ টোকেন: / বিশ্রাম / অধিবেশন / টোকেন থেকে নেওয়া যেতে পারে

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
মিউট্যান্টমাহেশ

2

আমি ড্রুপাল 8 এ কাস্টম আরএসটিফুল লগইন ব্যবহার করি তবে কুকির সাথে নয়। এটি একটি মোবাইল অ্যাপ্লিকেশানের জন্য এবং প্রতিবার যখন আমার তথ্যের প্রয়োজন হয়, আমি একটি সাধারণ প্রমাণীকরণ ব্যবহার করি:

ড্রুপাল 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

আপনি ডিলিট / পোস্টের মতো আরও পদ্ধতি যুক্ত করতে পারেন

তারপরে আমাদের ফাইলটি দরকার

ইউএসআরসিআরআরসোর্স.পিএফপি এসসিআর / প্লাগইন / রেস্ট / রিসোর্সে

    <?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 এর উত্তর অনুসরণ করে আপনি যদি আজাকাক্সের সাথে লগইন ফর্মটি প্রয়োগ করতে চান তবে উদাহরণস্বরূপ আপনি jQuery ব্যবহার করতে পারেন।

1. একটি সিএসআরএফ টোকেন পান

user/loginড্রুপাল 8 এপিআইয়ের শেষ পয়েন্টে আমাদের একটি পোষ্ট অনুরোধ করতে হবে । এই শেষ পয়েন্টটি ("নিরাপদ পদ্ধতি হিসাবে বিবেচিত) এর জন্য আপনাকে একটি সিএসআরএফ টোকেন প্রেরণ করা দরকার।

প্রথম পদক্ষেপটি rest/session/tokenশেষ পয়েন্টে একটি এজেএক্স অনুরোধ পাঠিয়ে এই টোকেনটি পাওয়া :

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. লগইন করুন

নিম্নলিখিত এইচটিএমএল বিবেচনা করুন:

<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) {
                ...
            });
        });
    }
});

এই কোডটি দ্রুপাল 8.3 এর সাথে সফলভাবে পরীক্ষা করা হয়েছে।

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


0

হ্যাঁ নিশ্চিত, পোস্টম্যানের সাথে এটি কীভাবে পরীক্ষা করা যায় সে সম্পর্কে আমি একটি ব্লগ তৈরি করেছি এবং আপনার ড্রুপাল সাইটটি কীভাবে কনফিগার করা যায় সে সম্পর্কেও অন্য একটি ।

এই প্রকল্পে আমি টোকেনের জন্য সরল OAuth মডিউলটি ব্যবহার করে কৌণিক দিয়ে দ্রুপালের জন্য একটি লগইন করেছি।

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