Kullanıcı girişi REST biçimi


13

Herkes var mı çalışma Drupal 8 DİNLENME Girişi?

Ben de bunu denedim.

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

Bana JSON yerine HTML döndürüyor .

Yanıtlar:


15

8.2'den başlayarak, Drupal Çerez kimlik doğrulaması için json uç noktalarını destekler. Artık formu göndermenize gerek yok 🎉

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

Çıktı şöyle görünecek

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

Kayıt değiştir: https://www.drupal.org/node/2720655

Diğer kimlik doğrulama yöntemleri: https://www.drupal.org/docs/8/core/modules/rest/using-other-authentication-protocols


Bu işe yarayamıyorum, 403 "Bu rotaya sadece anonim kullanıcılar tarafından erişilebilir." REST kullandığım için garip giriş
jim smith

1
@jimsmith Aramayı test etmek için ne kullanıyorsunuz? Postman'ı kullanmadan önce bu sorunu yaşadım çünkü Chrome Çerezlerimi alıp giriş yaptığımı söylüyor. Bunu tarayıcıda oturumunuzu kapatıp tekrar göndererek test edebilirsiniz
Antero Duarte

12

Drupal 8 REST için JavaScript üzerinden nasıl giriş yapabileceğiniz aşağıda açıklanmıştır:

Drupal 8.2 ve sonrası

  • POST :http://example.com/user/login?_format=json
  • İçerik türü :application/json
  • Veri :{ "name": "admin", "pass": "myPassword" }
  • Yanıt :200 OK

Bu, çerez kimlik doğrulaması yoluyla düzgün bir şekilde oturum açar ve buna benzer bir sonuç döndürür:

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

JavaScript ile giriş yapmayı çok kolay kılan jDrupal adında bir katkı modülü oluşturdum :

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

Drupal 8.2 öncesi

  • POST :http://example.com/user/login
  • İçerik türü :application/x-www-form-urlencoded
  • Veri :name=admin&pass=myPassword&form_id=user_login_form
  • Yanıt :200 OK | 303 See Other

URL'deki verileri bir sorgu dizesi olarak gönderirsiniz. Sonuç HTML olacaktır, bu nedenle sizin için yararlı bir şey döndürmez, ancak çerez kimlik doğrulaması yoluyla düzgün bir şekilde oturum açar.


HTML döndürmek kaçınılmaz mı?
niksmac

Bu noktada AFAIK, evet HTML kaçınılmazdır. Bunun zaman içinde geliştirileceğini düşünürüm, çünkü örneğin bir kullanıcıyı REST yoluyla kaydetmenin henüz bir yolu yok, ancak bir sorun oluştu.
tyler.frankenstein

benim için işe yaramadı, gerekli Temel Kimlik Doğrulama da kullanmak mı?
Yusef

FYI, JSON, Drupal 8.2'den itibaren döndürülür, böylece artık HTML döndürülmez.
tyler.frankenstein

8
  1. Bir HTTP isteği Content-Type'a dayanarak RESTful değildir.
  2. " REST Girişi " teknik olarak bir oksimorondur.

RESTful kimlik doğrulaması, vatansız olduğu için her istekle kimlik doğrulaması göndermek anlamına gelir. Drupal 8 çekirdeği tarafından sağlanan örnek, bir kullanıcıya GET aracılığıyla İçeriğe erişim izni olan Temel HTTP Kimlik Doğrulaması yoluyla bir HTTP isteği için kimlik doğrulama bilgilerini göndermeye izin veren Temel Kimlik Doğrulama modülüdür.

RESTful Örnek

Kıvrım: 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

Ancak bu genellikle yeterince iyi değildir. Simple_oauth ve oauth Contrib modülleri sırasıyla OAuth 2 ve 1 destek sağlar., Bir HTTP isteği OAuth kimlik doğrulaması ile yapılabilir hangi OAuth iş bu modüllerin tarif akımlarının göre jetonudur.

Ama asıl soru şu ki

Web Hizmetleri API'sı aracılığıyla nasıl giriş yapabilirim?

Bunu yapmak için kararlı bir Drupal 8 modülü yoktur, ancak Hizmetler modülü RESTful olmayan eylemler ve "login" gibi hedefli eylemler oluşturmak için yöntemler sağlar.

"Api" adlı bir bitiş noktası kurduktan sonra aşağıdakiler çalışır:

Kıvrım: 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"}

Bu, JSON oturum kimliği ve adını döndürür (yanıtın Set-Cookie başlığında da ayarlanır).

ve ayrıca aşağıdaki kod parçacığıyla Jquery ajax çağrısı ile giriş yapabilirsiniz

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

Hizmetler harika görünüyor, ancak Drupal çekirdeği D8 IMO'da berbat durumda. çok daha fazlası var.
niksmac


4

Drupal Çekirdek sürümü: 8.x-4.x

İlk önce kullanıcı oturum açma hizmetini etkinleştirmeniz gerekiyor, bu birçok şekilde gerçekleştirilebilir, REST UI modülünü kullanmayı tercih ederim .

/ Admin / config / services / rest adresine gidin ve User Rest kaynağını etkinleştirin .

Etkinleştirildikten sonra , Kullanıcı kaynağının yanındaki Düzenle'yi tıklayarak / admin / config / services / rest / resource / entity% 3Auser / edit öğesine gidebilirsiniz . GET yöntemini etkinleştirdiğinizden emin olun .

resim açıklamasını buraya girin

Artık her şeyin kurulumuna sahipsiniz, terminalde bu komutu çalıştırarak veya Postacı ve Restlet istemcileri gibi kıvırma istekleri için herhangi bir uygulamayı kullanarak hizmeti kullanmaya başlayabilirsiniz .

NOT : CSRF Jetonu şu adresten edinilebilir: / rest / session / token

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'

Dönüş nesneleri aşağıdaki gibidir:

BAŞARI :

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

ARIZA :

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

> / Admin / config / services / rest adresine gidin ve User Rest kaynağını etkinleştirin . REST api ile oturum açmak için Kullanıcı kaynağını etkinleştirmeniz gerekmediğini düşünüyorum. Bu kaynağın etkinleştirilmesi yalnızca Kullanıcı varlığında CRUD işlemi gerçekleştirmek istiyorsanız gereklidir. @ Tyler.frankenstein
MutantMahesh

2

Ben drupal 8 özel RESTFul giriş kullanın ama çerez ile değil. Bu bir mobil uygulama için ve her bilgi gerektiğinde basit bir Kimlik Doğrulaması kullanıyorum:

Drupal 8.2x'ten beri bir modülde 2 dosyaya ihtiyacımız var:

config / install klasöründe 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 gibi daha fazla yöntem ekleyebilirsiniz

Sonra dosyaya ihtiyacımız var

src / Plugin / rest / resource içindeki userRestRessource.php

    <?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 yöntemini veya yapılandırmanıza eklediğiniz herhangi bir şeyi kabul etmek için kullanıcı hakkına gitmeyi unutmayın.

Bununla, her özel varlık için her özel REST dosyasını oluşturabilirsiniz.

Ve benim js: aramayı unutma

yoursiteUrl / dinlenme / oturum / belirteç

jeton almak için

$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'ın cevabını takiben, Ajax ile bir giriş formu uygulamak istiyorsanız, örneğin jQuery kullanabilirsiniz.

1. CSRF jetonu alın

user/loginDrupal 8 API'sının uç noktasına POST isteği yapmamız gerekiyor . Bu uç nokta ("güvenli olmayan yöntem" olarak kabul edilir) bir CSRF jetonu göndermenizi gerektirir.

İlk adım, rest/session/tokenbitiş noktasına bir AJAX isteği göndererek bu belirteci elde etmektir :

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

NB:

  • callbackParametre CSRF belirteci getirilen olacak çağrılacak bir geri arama işlevi
  • Drupal.urlFonksiyonu sitenin temel URL'sini almak için kullanırız

Bu jeton bir X-CSRF-Tokenbaşlık ile gönderilmelidir.

2. Giriş

Aşağıdaki HTML'yi düşünün:

<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>

... ve ilgili jQuery kodu:

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

Bu kod Drupal 8.3 ile başarıyla test edilmiştir.

Umarım bu sana yardımcı olmuştur!


0

Evet, postacıyla nasıl test edileceğine ve drupal sitenizi nasıl yapılandıracağınıza dair bir blog hazırladım .

Bu projede , token için Basit OAuth modülünü kullanarak açısal ile Drupal için bir giriş yaptım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.