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*/
})
})
}
我正在尝试使用 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*/
})
})
}