2016-05-23 4 views
0

В настоящее время я создаю небольшое приложение и столкнулся с проблемой. Я использую модуль flw jwt для того, чтобы пользователь мог получить токен, чтобы иметь возможность доступа к api, выставленному в python. Я использую angularjs для разработки моего интерфейса. При попытке входа на сервере, что мой API, располагающийся на возвращении 400 ошибкиFlask jwt auth endpoint возвращает 400

"POST /auth HTTP/1.1" 400 

согласно документации, все, что нужно сделать, это передать свои полномочия на Идентой конечную точку, и я должен быть в состоянии получить обратно маркер, как показано на странице: https://pythonhosted.org/Flask-JWT/

Вот моя текущая реализация сервера приложений:

from flask import Flask 
from flask_jwt import JWT, jwt_required, current_identity 
from flask.ext.cors import CORS 
from werkzeug.security import safe_str_cmp 
from wol import User, db 
import hashlib 


def authenticate(username, password): 
    user = User.query.filter_by(username=username).first() 
    print str(user) 
    if user and safe_str_cmp(user.password.encode('utf-8'), password.encode('utf-8')): 
     return user 


def identity(payload): 
    user_id = payload['identity'] 
    return User.query.filter_by(UserID=user_id) 


app = Flask(__name__) 
CORS(app) 
app.debug = True 
app.config['SECRET_KEY'] = 'super-secret' 

jwt = JWT(app, authenticate, identity) 
admin = User("test", "test1") 
db.session.add(admin) 
db.session.commit() 

@app.route('/protected') 
@jwt_required() 
def protected(): 
    return '%s' % current_identity 


@app.route('/register', methods=['POST']) 
def register(username, password, confirmPassword): 
    # we probably want to hash these passwords when storing in db 
    # we'll hash both the password and confirm password 
    pass_hash = hashlib.sha256(password).hexdigest() 
    conf_pass_hash = hashlib.sha256(confirmPassword).hexdigest() 

    if pass_hash == conf_pass_hash: 
     new_user = User(username, password) 
     db.session.add(new_user) 
     db.session.commit() 

@app.route('/allusers') 
def get_all_users(): 
    users = User.query.all() 
    return users 


if __name__ == '__main__': 
    app.run(host='0.0.0.0') 

и вот моя реализация angularjs:

(function() { 
     angular.module('loginApp', []).controller('loginController', function($scope, $http) { 
     $scope.data = {}; 

     //we can now process the form 
     $scope.processForm = function() { 
      $http({ 
      method : 'POST', 
      url  : 'http://192.168.0.99:5000/auth', 
      data : $.param($scope.data), // pass in data as strings 
      headers : { 'Content-Type': 'application/json' } // set the headers so angular passing info as form data (not request payload) 
     }) 
      .success(function(data) { 
      console.log("successful") 
      console.log(data); 
      }); 
     }; 
     }); 
    }()); 

Я установил режим отладки на сервере, который работает мой питон код и он возвращает 400

+0

Что такое тело ответа на 400? – univerio

ответ

1

О, это потому, что вы используете $.param, которые сериализующий объекты в параметры строки запроса, но API ожидает JSON , Вы должны сделать:

data: JSON.stringify($scope.data) 

вместо этого.