Auth0 NodeJS JWT-аутентификация в API для мобильного приложения - PullRequest
0 голосов
/ 20 марта 2019

Я новичок в Auth0 и несколько дней назад сделал приложение для iPhone, которое использует авторизацию Auth0, следуя инструкции.Это было успешно, так что я мог успешно получить accessToken и idToken.Сразу после этого я попытался создать сервер nodejs для API этого приложения с Auth0 jwt.На этот раз я также следовал учебному пособию по Auth0, и мне удалось получить ответ 200 с токеном тестового доступа от API Auth0.

enter image description here

Но моя проблема в том, что яAPI запроса на приложении iPhone с токеном, сервер узла выдает исключение.Если я отправляю accessToken, он выбрасывает UnauthorizedError: jwt malformed, и я обнаружил, что мобильный accessToken имеет совершенно другой формат, чем в примере accessToken.

UnauthorizedError: jwt malformed
    at /Volumes/Work/Work/NodeJS/GeoServer/GeoServer/node_modules/express-jwt/lib/index.js:102:22
    at Object.module.exports [as verify] (/Volumes/Work/Work/NodeJS/GeoServer/GeoServer/node_modules/jsonwebtoken/verify.js:63:12)
    at verifyToken (/Volumes/Work/Work/NodeJS/GeoServer/GeoServer/node_modules/express-jwt/lib/index.js:100:13)
    at fn (/Volumes/Work/Work/NodeJS/GeoServer/GeoServer/node_modules/async/lib/async.js:746:34)
    at /Volumes/Work/Work/NodeJS/GeoServer/GeoServer/node_modules/async/lib/async.js:1213:16
    at /Volumes/Work/Work/NodeJS/GeoServer/GeoServer/node_modules/async/lib/async.js:166:37
    at /Volumes/Work/Work/NodeJS/GeoServer/GeoServer/node_modules/async/lib/async.js:706:43
    at /Volumes/Work/Work/NodeJS/GeoServer/GeoServer/node_modules/async/lib/async.js:167:37
    at Immediate.<anonymous> (/Volumes/Work/Work/NodeJS/GeoServer/GeoServer/node_modules/async/lib/async.js:1206:34)
    at runCallback (timers.js:705:18)

И если я отправлю idToken,malformed исключение прошло, но в этот раз я получил еще одну ошибку.

Error: getaddrinfo ENOTFOUND undefined undefined:443
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:57:26)

Я работаю над этой частью в течение нескольких дней, но пока не нашел решения.Пожалуйста, помогите мне решить эту проблему.

Ниже приведены коды узлов сервера.

import express from 'express';
import jwt from 'express-jwt';
import jwksRsa from 'jwks-rsa';
import cors from 'cors';
import bodyParser from 'body-parser';

const app = express();

app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
}));

const port = 3000

// Create middleware for checking the JWT
const jwtCheck = jwt({
    // Dynamically provide a signing key based on the kid in the header and the singing keys provided by the JWKS endpoint.
    secret: jwksRsa.expressJwtSecret({
        cache: true,
        rateLimit: true,
        jwksRequestsPerMinute: 5,
        jwksUri: `https://${process.env.AUTH0_DOMAIN}/.well-known/jwks.json`
    }),

    // Validate the audience and the issuer.
    audience: process.env.AUTH0_AUDIENCE,
    issuer: `https://${process.env.AUTH0_DOMAIN}`,
    algorithms: ['RS256']
});
app.use(jwtCheck);

const locationHistory: any[] = [];

app.get('/', (req, res) => res.send('Hello World!'))

app.post('/api/location', (req, res) => {
    locationHistory.push({latitude: req.body.latitude, longitude: req.body.longitude});
    res.send(locationHistory);
})

app.listen(port, () => console.log(`API server is listening on port ${port}!`))

1 Ответ

0 голосов
/ 21 марта 2019

Несколько дней исследований, наконец, я нашел причину проблемы.
Существует два приложения - одно приложение Default Native и одно приложение MTM API. Я использовал старое приложение Native audience в приложении для iPhone, поэтому два accessTokens имеют разный формат.
audience - это идентификатор каждого приложения Auth0, поэтому я должен был обратить на это внимание.

enter image description here

...