Auth0 userinfo запрос не обрабатывается - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь совершать аутентифицированные звонки в GitHub, используя Auth0 в качестве посредника.

Я следую руководству по https://auth0.com/docs/connections/calling-an-external-idp-api,, но когда дело доходит до шага 2. Получая user_id, я сталкиваюсь с проблемой с конечной точкой / userinfo.

const rp = require('request-promise')

const auth0_options = {
method: 'POST',
url: 'https://MY_DEV_ID/oauth/token',
headers: {'content-type': 'application/x-www-form-urlencoded'},
form: {
    grant_type: 'client_credentials',
    client_id: 'MY_CLIENT_ID',
    client_secret: 'MY_CLIENT_SECRET',
    audience: 'https://MY_DEV_ID/api/v2/'
    }
};
const auth0_result = JSON.parse(await rp(auth0_options));
const access_token_one = auth0_result.access_token;

Затем я пытаюсь вызвать конечную точку userinfo, как описано на https://auth0.com/docs/api/authentication#user-profile

const userinfo_options = { method: 'GET',
url: 'https://MY_DEV_ID/userinfo',
headers: { 'Authorization' : `Bearer ${access_token_one}`} 
};
const userinfo_result = JSON.parse(await rp(userinfo_options));

, но эта проблемане работает, он возвращает пустой объект, который, как я полагаю, вызван тем, что он не авторизован.

Я просмотрел много предыдущих вопросов о / userinfo здесь на SO, но обнаружил, что во всех случаях я обнаружил проблемуя что-то уже защитил (токен, аудитория и т. д.)

Редактировать: конфигурация openid для API auth0, который я пытаюсь использовать:

scopes_supported": [
    "openid",
    "profile",
    "offline_access",
    "name",
    "given_name",
    "family_name",
    "nickname",
    "email",
    "email_verified",
    "picture",
    "created_at",
    "identities",
    "phone",
    "address"
  ],
  "response_types_supported": [
    "code",
    "token",
    "id_token",
    "code token",
    "code id_token",
    "token id_token",
    "code token id_token"
  ],

1 Ответ

1 голос
/ 02 октября 2019

Ладно, очевидно, что access token, который вы получаете в моем auth0_result, не является точным для userinfo, что требует другого токена. Я выполняю этот код в навыке alexa, мой первоначальный access token исходит из ссылки на учетную запись в процессе установки.

Вот окончательное рабочее решение для всех, кто сталкивался с этой проблемой: (мое решение для amazonalexa, но с некоторыми изменениями он должен работать для любого сайта, к которому вы пытаетесь подключиться)

let attributes = handlerInput.attributesManager.getSessionAttributes();
attributes.loginToken = handlerInput.requestEnvelope.context.System.user.accessToken;
login_options = {
    method: 'GET',
    uri: '{YOUR_AUTH0_TENANT_ID}/userinfo',
    headers : {
        Authorization : 'Bearer ' + attributes.loginToken,
    }
};
const login_result = JSON.parse(await rp(login_options));
attributes.loggedInUser = login_result.nickname;

const auth0_options = {
method: 'POST',
url: '{YOUR_AUTH0_TENANT_ID}/oauth/token',
headers: {'content-type': 'application/x-www-form-urlencoded'},
form: {
    grant_type: 'client_credentials',
    client_id: '{AUTH0_APPLICATION_CLIENT_ID}',
    client_secret: '{AUTH0_APPLICATION_CLIENT_SECRET}',
    audience: '{YOUR_AUTH0_TENANT_ID}/api/v2/',
}
};
const auth0_result = JSON.parse(await rp(auth0_options));
const access_token_one = auth0_result.access_token;

const github_options = {
    method: 'GET',
    url: `{YOUR_AUTH0_TENANT_ID}/api/v2/users/${login_result.sub}`,
    headers : {'authorization' : 'Bearer ' + access_token_one}
};
const github_result = JSON.parse(await rp(github_options));
attributes.token = github_result.identities[0].access_token;
handlerInput.attributesManager.setSessionAttributes(attributes);

после этого в файле attribute.token будет содержаться токен доступа, который вы можете использовать для аутентификации на GitHub (установить токен)истечение до максимального значения (30 дней) для auth0 или сохранения маркера обновления для последующего использования), пример http-запроса:

function customhttpgetrequest(url, attributes){
    const customHeaderRequest = request.defaults({
        headers: {
            'User-Agent': attributes.loggedInUser,
            'Authorization': 'Bearer ' + attributes.token
        }
    })
    return new Promise((resolve, reject) => {
        customHeaderRequest.get(url, (error, response, body) => {
            if (error) {
                return reject(error)
            }
            resolve(JSON.parse(body)); /*simply resolve(body) should work aswell, not sure why i parse it here*/
        })
    })
}

...