0

我在后端使用 symfony 并在前端使用 angular js 1.6 进行身份验证,但是现在我在发送请求时遇到错误我有错误状态 401(无效凭据)..我使用 jwtauthentificationBundle 生成令牌..我在 localStorage 和拦截器中添加令牌但是当我点击了你午餐服务拦截器页面中的任何按钮......

配置.yml:

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: services.yml }
    - { resource: "@MedBundle/Resources/config/services.yml" }

# Put parameters here that don't need to change on each machine where the app is deployed
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
    locale: en

framework:
    secret:          "%secret%"
    csrf_protection: ~
    form: ~
    session:
        handler_id: ~
fos_user:
    db_driver: orm
    firewall_name: main
    user_class: AppBundle\Entity\User
    from_email:
        address: "test@test.com"
        sender_name: "Demo String"
    service:
        mailer: fos_user.mailer.twig_swift

lexik_jwt_authentication:
    private_key_path: %jwt_private_key_path%
    public_key_path:  %jwt_public_key_path%
    pass_phrase:      %jwt_key_pass_phrase%
    token_ttl:        %jwt_token_ttl%

nelmio_cors:
    defaults:
        allow_origin:   ["%cors_allow_origin%"]
        allow_methods:  ["POST", "PUT", "GET", "DELETE", "OPTIONS"]
        allow_headers:  ["content-type", "authorization"]
        expose_headers: ["link"]
        max_age:       3600
    paths:
        '^/': ~
# Doctrine Configuration
doctrine:
    dbal:
        driver: pdo_mysql
        host: '%database_host%'
        port: '%database_port%'
        dbname: '%database_name%'
        user: '%database_user%'
        password: '%database_password%'
        charset: UTF8
        # if using pdo_sqlite as your database driver:
        #   1. add the path in parameters.yml
        #     e.g. database_path: '%kernel.root_dir%/data/data.db3'
        #   2. Uncomment database_path in parameters.yml.dist
        #   3. Uncomment next line:
        #path: '%database_path%'

    orm:
        auto_generate_proxy_classes: '%kernel.debug%'
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true

# Swiftmailer Configuration
swiftmailer:
    transport: '%mailer_transport%'
    host: '%mailer_host%'
    username: '%mailer_user%'
    password: '%mailer_password%'
    spool: { type: memory }

fos_rest:
    view:
        view_response_listener: 'force'
        formats:
            json: true
    format_listener:
        rules:
            - { path: '^/api', priorities: ['json'], fallback_format: json, prefer_extension: true }
            - { path: '^/', stop: true }

安全性.yml:

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: bcrypt

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        login:
            pattern:  ^/api/login
            stateless: true
            anonymous: true
            form_login:
                check_path:               /api/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:
                authorization_header:
                    enabled: true
                    prefix: Bearer
                query_parameter:
                    enabled: true
                    name: bearer
                throw_exceptions: false
                create_entry_point: true

        main:
            pattern: ^/
            provider: fos_userbundle
            stateless: true
            form_login: 
                check_path: /login_check
                username_parameter: _username
                password_parameter: _password
                success_handler: lexik_jwt_authentication.handler.authentication_success
                failure_handler: lexik_jwt_authentication.handler.authentication_failure
                require_previous_session: false
            logout: true
            anonymous: true


    access_control:
        - { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/api/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/api, role: IS_AUTHENTICATED_FULLY }

应用程序.js:

var app = angular.module("myApp", ["ngRoute","ngStorage"]);

app.config(['$routeProvider','$httpProvider', function($routeProvider,$httpProvider) {
  $routeProvider
    .when("/login", {
      templateUrl: Routing.generate('login',
        {template:"default/login.html.twig"}),
        controller: 'loginctrl',
    })
    .when("/register", {
      templateUrl: Routing.generate('register',
        {template:"default/registere.html.twig"}),
      controller: 'httpgetctrl',  
    })
    .when("/affiche", {
    templateUrl: Routing.generate('get',
        {template:"default/affiche.html.twig"}),
      controller: 'httpgetctrl',  
    });
    $httpProvider.interceptors.push('authInterceptor');

}]);

    app.controller("httpgetctrl", function ($scope, $http) {

        $scope.SendData = function () {
           // use $.param jQuery function to serialize data from JSON 
            var data = $.param({
                username: $scope.username,
                email: $scope.email,
                pass: $scope.password,
                confir: $scope.confirmationpass
            });

            var config = {
                headers : {
                    'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
                }
            }

            $http.post(Routing.generate('register'), data, config)
            .then(function (response) {
                console.log("success");
            })
            .catch(function() {
                console.log("error");
  })
        };

    });

    app.controller("loginctrl", function ($scope, $http,$localStorage) {

        $scope.login = function () {
           // use $.param jQuery function to serialize data from JSON 
            var data = $.param({
                username: $scope.user,
                password: $scope.pass
            });

            var config = {
                headers : {
                    'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
                }
            }

            $http.post(Routing.generate('login'), data, config)
            .then(function (response) {
                console.log("success login");                
                localStorage.token = response.data['token'] ;
                console.log(localStorage.token);
            })
            .catch(function() {
                console.log("error login");
  })
        };

    });

  app.factory('authInterceptor', function($rootScope, $q, $window) {
    return {
        request: function (config) {
            config.headers = config.headers || {};

            if (localStorage.token) {
                //config.headers.Authorization = 'Bearer ' + localStorage.token;
                config.headers['x-access-token'] = localStorage.token;
                console.log('done');
            }
            return config;
        },
        response: function (response) {
            if (response.status === 401) {
                // if 401 unauthenticated
                console.log("error 401");
            }
            return response || $q.when(response);
        }
    };
// call the factory ...
})    

index.html.twig:

{% extends 'base.html.twig' %}
{% block title %} Acceuil {% endblock %}
{% block stylesheets %}<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.3.7/cerulean/bootstrap.min.css">
<style>

a {
    text-decoration:none;
    color: #e74c3c;
        margin-right: 25px;

}

</style>

{% endblock %}
{% block body %}
<div class="container" ng-app="myApp">
    <a href="#/!">Acceuil</a>

<a href="#!login">Login</a>
<a href="#!register">Register</a> 
<a href="#!affiche">Affiche</a>
<br><br>

<div ng-view></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.5/angular-route.js"></script>
<script src="angularJwt.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/ngstorage/0.3.6/ngStorage.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/todc-bootstrap/3.3.7-3.3.13/js/bootstrap.min.js"></script>
<script type="text/javascript" src="{{ asset('bundles/fosjsrouting/js/router.js') }}"></script>
<script type="text/javascript" src="{{ path('fos_js_routing_js', {"callback": "fos.Router.setData"}) }}"></script>
<script type="text/javascript" src="{{ asset('bundles/fosjsrouting/js/app.js') }}"></script>

<script>



</script>
</div>
{% endblock %}

和代码控制器:

<?php

namespace MedBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use FOS\RestBundle\Controller\Annotations\RouteResource;
use Symfony\Component\HttpFoundation\JsonResponse;
use FOS\RestBundle\View\ViewHandler;
use FOS\RestBundle\View\View;
use MedBundle\Entity\Med;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\HttpFoundation\Response;
use AppBundle\EventListener\JWTCreatedlistener;

 Class ApiController extends Controller {

    public function getAction() {

        $em = $this->getDoctrine()->getManager();
        $test = $em->getRepository('MedBundle:Med')->findAll();
        //$viewHandler = $this->get('fos_rest.view_handler');

        // Création d'une vue FOSRestBundle
        //$view = View::create($test);
        //$view->setFormat('json');

        // Gestion de la réponse
        //return $viewHandler->handle($view);
        return array('test'=>$test);

    }


    public function loginAction() {

        $em = $this->getDoctrine()->getManager();
        $request = $this->getRequest();
        $test = null; $token = null; $res = 'null';
        if ($request->getMethod() == 'POST') {
            $username = $request->request->get('username');
            $password = $request->request->get('password');

         $test = $em->getRepository('MedBundle:Med')->findOneBy(array('username' => $username));

            if (!($test)) { $res = "error"; } else{ 
                $salt= $test->getSalt();
                $pass = crypt($password,$salt);
                if ( $pass !== $test->getPassword() ) { $res='error password'; } else {
                $res='success';   

            $token = $this->get('lexik_jwt_authentication.jwt_manager')->create($test);

            $test->setToken($token);
            $em->persist($test);
            $em->flush();

         } } 
         //return new Response($res);
         $test = [];
         $test['token'] = $token;
         $test['res'] = $res;
         return new JsonResponse($test);
 }    

            return $this->render('default/login.html.twig',array('test' => json_encode($test), 'token' => $token,'res' => json_encode($res)));

    }



    public function logoutAction() {



    }

 }
4

0 回答 0