Файл App.js
const express = require('express');
const bodyParser = require('body-parser');
const graphqlHttp = require('express-graphql');
const { buildSchema } = require('graphql');
const isAuth = require('./middleware/is-auth');
var mysql = require('mysql');
const app = express();
const jwt = require('jsonwebtoken');
var connection = mysql.createConnection({
host : 'localhost', //mysql database host name
user : 'root', //mysql database user name
password : '', //mysql database password
database : 'test' //mysql database name
});
connection.connect(function(err) {
if (err) throw err
console.info('You are now connected with mysql database...')
})
app.use(bodyParser.json());
app.use(isAuth);
app.use(
'/graphql',
graphqlHttp({
schema: buildSchema(`
type users {
id: String!
username: String!
password: String!
role: String!
name: String!
photo: String!
}
type AuthData
{
userID: String!
token: String!
tokenExpiration: Int!
}
type RootQuery {
getUsers: [users!]!
login(username: String!, password: String!): AuthData!
}
type RootMutation {
createUsers(name: String): String
}
schema {
query: RootQuery
mutation: RootMutation
}
`),
rootValue: {
login: async ({username,password}) => {
return new Promise((resolve, reject) => {
connection.query('select * from users where username = "'+username+'"', (error, results, fields) => {
if (error) {
reject(error)
} else {
resolve(results);
}
})
}).then(function(result) {
const users = result;
if (!users || users[0] == null)
{
throw new Error('User does not exist')
}
const token = jwt.sign({userID: users[0]['id'], username: users[0]['username']}, 'SomeSuperSecretKey', {
expiresIn: '1h'
});
return { userID: users[0]['id'], token, token,tokenExpiration: 1}
})
},
getUsers: async (req) => {
if (!req.isAuth)
{
throw new Error('Unauthenticated');
}
// Note, we have to return the Promise here
return new Promise((resolve, reject) => {
connection.query('select * from users', (error, results, fields) => {
if (error) {
reject(error)
} else {
// Don't stringify
resolve(results)
}
})
})
},
},
graphiql: true
})
);
app.listen(3000);
Файл is-auth.js
const jwt = require ('jsonwebtoken');
module.exports = (req, res, next) => {
const authHeader = req.get('Authorization');
if (!authHeader){
console.info("Here");
req.isAuth = false;
return next();
}
const token = authHeader.split(' ')[1]; // bearer tokenValue
if (!token || token === ''){
console.info("Here1");
req.authHeader = false;
return next();
}
let decodedToken;
try
{
console.info(token);
decodedToken = jwt.verify(token, 'SomeSuperSecretKey'); //same key used in app.js
}catch(err){
console.info(err);
req.isAuth = false;
return next();
}
if (!decodedToken){
req.isAuth = true;
req.userID = decodedToken.userID;
return next();
}
}
Функция jwt.verify не возвращает ничего, что она застряла, и API не дает ответа. Так что проблема в функции проверки, в которой она застряла. И если я ввожу собственный пользовательский токен, он выдает другую ошибку, в которой говорится, что вам не разрешено вводить свой собственный пользовательский токен, только можно использовать токены, сгенерированные jwt.
разобрался, да, это была ошибка, и еще одна ошибка была в файле app.js, где req — второй параметр, а я принимал его как 1-й параметр.





В самом конце вашего примера кода я вижу две вещи: (1) вы устанавливаете
req.isAuth = trueтолько в случае, когдаjwt.verifyвозвращает ложное значение; и (2) если последнее условное выражение не выполняется, ваша промежуточная функция не вызываетnext()и не выдает ответ наres. Добавление дополнительных операторовconsole.info, чтобы проверить, как далеко вы на самом деле продвинулись, также поможет вам в отладке.