2017-05-12 12 views
6

मैं सिर्फ जेडब्ल्यूटी का उपयोग करके लॉगिन के साथ अपना एसएफ 3 एपीआई बनाने की कोशिश कर रहा हूं लेकिन मुझे प्रमाणीकरण के साथ कुछ परेशानी हो रही है। तो यहां मेरी विन्यास और कुछ परीक्षण है जो मुझे एहसास हुआ।सिम्फनी 3 + जेडब्ल्यूटी + कोणीय 2 + प्रमाणीकरण (विकल्प विधि)

security.yml:

security: 
    firewalls: 
     login: 
     pattern: ^/api/auth 
     stateless: true 
     anonymous: true 
     form_login: 
      check_path:     /api/auth/login-check 
      success_handler:   lexik_jwt_authentication.handler.authentication_success 
      failure_handler:   lexik_jwt_authentication.handler.authentication_failure 
      require_previous_session: false 

     api: 
      pattern: ^/api 
      stateless: true 
      lexik_jwt: ~ 
    access_control: 
     - { path: ^/api/auth, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/api,  roles: IS_AUTHENTICATED_FULLY } 

routing.yml:

auth: 
    path:  /auth 
    defaults: { _controller: api.controller.auth:postAction } 
    methods: [OPTIONS, POST] 

api_login_check: 
    path:  /auth/login-check 

config.yml:

:

nelmio_cors: 
    paths: 
     '^/api/': 
      allow_origin: ['*'] 
      allow_headers: ['*'] 
      allow_methods: ['POST', 'PUT', 'GET', 'DELETE', 'OPTIONS'] 
      max_age: 3600 

जब मैं मार्ग डिबग मैं इस उत्पादन प्राप्त

$ php bin/console debug:router 
----------------------------------- ------------------ -------- ------ ----------------------------------- 
Name        Method    Scheme Host Path 
----------------------------------- ------------------ -------- ------ ----------------------------------- 
.... 
api_homepage      ANY    ANY  ANY /api/ 
auth        OPTIONS|POST  ANY  ANY /api/auth 
api_login_check      ANY    ANY  ANY /api/auth/login-check 
.... 

अभी तक इतना अच्छा है, अब यहां समस्याएं आती हैं।

मैं

$ curl -v -X POST http://api.local/api/auth/login-check -d _username=user -d _password=user 
Note: Unnecessary use of -X or --request, POST is already inferred. 
* Trying 127.0.0.1... 
* TCP_NODELAY set 
* Connected to api.local (127.0.0.1) port 80 (#0) 
> POST /api/auth/login-check HTTP/1.1 
> Host: api.local 
> User-Agent: curl/7.51.0 
> Accept: */* 
> Content-Length: 33 
> Content-Type: application/x-www-form-urlencoded 
> 
* upload completely sent off: 33 out of 33 bytes 
< HTTP/1.1 200 OK 
< Server: nginx/1.10.3 
< Content-Type: application/json 
< Transfer-Encoding: chunked 
< Connection: keep-alive 
< X-Powered-By: PHP/7.1.3 
< Set-Cookie: PHPSESSID=c4o6kuelf914gjnq09m38ec0c7; path=/; HttpOnly 
< Cache-Control: no-cache, private 
< Date: Fri, 12 May 2017 16:37:23 GMT 
< Access-Control-Allow-Origin: * 
< Access-Control-Allow-Methods: GET, POST, OPTIONS, DELETE, PUT 
< Access-Control-Allow-Credentials: true 
< Access-Control-Allow-Headers: User-Agent,Keep-Alive,Content-Type,Access-Control-Allow-Headers 
< 
* Curl_http_done: called premature == 0 
* Connection #0 to host api.local left intact 
{"token":"b2xlc9.......DW6uAwx4"} 

बढ़िया है, यह काम कर रहा से प्रमाणीकरण की वापसी का परीक्षण करने के लिए प्रबंधन!

जब मैं ब्राउज़र में एक ही अनुरोध का प्रयास करता हूं तो मुझे विकल्प विधि पर 404 प्राप्त होता है, इसलिए मैं एक कर्ल विकल्प अनुरोध के साथ अनुरोध को फिर से बनाने का प्रयास करता हूं (वास्तव में मुझे नहीं पता कि यह कोई समझ में आता है, लेकिन मैंने कोशिश की यह वैसे भी, जहां प्रतिक्रिया:

$ curl -v -X OPTIONS http://api.local/api/auth/login-check -d _username=user -d _password=user 
* Trying 127.0.0.1... 
* TCP_NODELAY set 
* Connected to api.local (127.0.0.1) port 80 (#0) 
> OPTIONS /api/auth/login-check HTTP/1.1 
> Host: api.local 
> User-Agent: curl/7.51.0 
> Accept: */* 
> Content-Length: 33 
> Content-Type: application/x-www-form-urlencoded 
> 
* upload completely sent off: 33 out of 33 bytes 
< HTTP/1.1 404 Not Found 
< Server: nginx/1.10.3 
< Content-Type: application/json 
< Transfer-Encoding: chunked 
< Connection: keep-alive 
< X-Powered-By: PHP/7.1.3 
< Cache-Control: no-cache, private 
< Date: Fri, 12 May 2017 16:35:49 GMT 
< 
{"error":{"code":404,"message":"Not Found"}} 
* Curl_http_done: called premature == 0 
* Connection #0 to host api.local left intact 

क्या मैं समझता हूँ कि एपीआई विकल्प विधि के लिए मार्ग, मैं भी तरीकों को जोड़ने का प्रयास नहीं मिल रहा है है: [विकल्प, पोस्ट]api_login_check को मार्ग लेकिन एक ही आउटपुट।

परीक्षण और बिना nelmioCorsBundle, एक ही आउटपुट।

मैं यहां थोड़ा खो गया हूं, कोई भी देख सकता है कि मैं क्या गलत कर रहा हूं?

धन्यवाद

उत्तर

0

आपका प्रमाणन मार्गों routing.yml पर/OAuth हैं, लेकिन आप उपयोग कर रहे हैं अपने उदाहरण में/API/प्रमाणन। मुझे लगता है कि आपके पास थोड़ा गलत कॉन्फ़िगरेशन है।

लेकिन आपकी वास्तविक समस्या preflight है, ब्राउज़र अनुरोध से पहले ऐसा करते हैं, यह आपके प्रमाणीकरण का कारण ब्राउज़र पर विफल रहता है और कर्ल के साथ काम करता है।

आपके ऐप को मार्गों के लिए विकल्प अनुरोधों का जवाब देना चाहिए और ब्राउज़र को बताएं कि कौन से विधियों या शीर्षकों को जारी रखने की अनुमति है और यह NelmioCorsBundle प्राप्त करने के लिए सबसे अच्छा है।

आपको अपने सभी मार्गों को कवर करने की आवश्यकता है, आपके कॉन्फ़िगरेशन मैच केवल/एपीआई मार्ग और आपके लॉगिन, इस तरह nelmio_cors कॉन्फ़िगरेशन आज़माएं।

nelmio_cors: 
    defaults: 
     allow_credentials: false 
     allow_origin: [] 
     allow_headers: [] 
     allow_methods: [] 
     expose_headers: [] 
     max_age: 0 
     hosts: [] 
     origin_regex: false 
    paths: 
     '^/': 
      allow_origin: ['*'] 
      allow_headers: ['accept', 'authorization', 'content-type'] 
      allow_methods: ['OPTIONS', 'POST', 'PUT', 'PATCH', 'GET', 'DELETE'] 
      max_age: 3600 
संबंधित मुद्दे