Auth0 用户信息请求处理失败

Auth0 userinfo request fails to process

我正在尝试使用 Auth0 作为中介对 GitHub 进行经过身份验证的调用。

我正在按照 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));

但是这个不起作用,它 returns 一个空对象,我认为这是由于它未被授权。

我已经在 SO 上查找过许多关于 /userinfo 的问题,但发现在所有情况下我都发现问题是我已经得到保护的(令牌、观众等)

编辑: auth0 api 的 openid 配置我正在尝试使用:

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"
  ],

好吧,显然你在我的 auth0_result 中得到的 access token 不是 userinfo 的当前值,那个需要不同的标记。我是 运行 alexa 技能中的这段代码,我的初始 access token 来自设置过程中的帐户链接。

对于 运行 遇到此问题的任何人,这是最终可行的解决方案: (我的解决方案适用于 amazon alexa,但经过一些更改,它应该适用于您尝试连接的任何站点)

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);

在此之后,attributes.token 将包含一个访问令牌,您可以使用它在 GitHub 上验证自己(在 auth0 上将令牌有效期设置为最长(30 天)或存储刷新令牌供以后使用) ,示例 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*/
        })
    })
}