ibm-cloud - AppID userProfileManager.getUserInfo() 给出 UnauthorizedException 错误
问题描述
我正在使用 NodeJs SDK 使用 Appid 实现,我目前正在尝试ApplicationIdentityToken
通过TokenManager
. 下面是我的代码片段。
给你一个有效的tokenManager.getApplicationIdentityToken()
令牌,但我面临的问题是,每当我将此令牌传递给userProfileManager.getUserInfo(token)
它时,它都会给我一个UnauthorizedException
.
我已经剥离了整个代码并创建了一个小函数来测试令牌的获取并使用该userProfileManager.getUserInfo
函数进行验证。
注意:请忽略仅用于提供代码片段的反模式。
const userProfileManager = require('ibmcloud-appid').UserProfileManager;
userProfileManager.init({
oauthServerUrl: process.env.APPID_URL,
profilesUrl: process.env.APPID_PROFILES_URL,
});
const config = {
tenantId: process.env.TENANT_ID,
clientId: process.env.CLIENT_ID,
secret: process.env.CLIENT_SECRET,
oauthServerUrl: process.env.APPID_URL,
profilesUrl: process.env.APPID_PROFILES_URL,
};
let token = '';
const { TokenManager } = require('ibmcloud-appid');
const tokenManager = new TokenManager(config);
const getAppIdentityToken = async () => {
tokenManager
.getApplicationIdentityToken()
.then((appIdAuthContext) => {
console.log(` Access tokens from SDK : ${JSON.stringify(appIdAuthContext)}`);
token = appIdAuthContext.accessToken;
})
.then(async () => {
const data = await userProfileManager.getUserInfo(token);
console.log(data);
})
.catch((err) => {
console.error(err);
});
};
exports.getAppIdentityToken = getAppIdentityToken;
解决方案
TokenManager 用于自定义身份或应用程序身份流。应用程序身份流用于应用程序之间的通信(即 client_credentials 授权类型)。获取用户信息是用户到应用程序的通信(例如授权代码授权类型),因此您需要用户的访问令牌。您可以从会话中获取该令牌,前提是用户已登录:
accessToken = req.session[WebAppStrategy.AUTH_CONTEXT].accessToken;
有关更多详细信息,请参阅 SDK 的 README:https ://github.com/ibm-cloud-security/appid-serversdk-nodejs#manage-user-profile
你的用例是什么?您可能不需要使用 UserProfileManager 发出此附加请求。您可以在身份令牌中找到用户信息,并且可以使用自定义声明映射https://cloud.ibm.com/docs/appid?topic=appid-customizing-tokens向令牌添加其他信息
推荐阅读
- django - Django throws OperationalError : index row requires 35424 bytes, maximum size is 8191
- python-3.x - Why "a is b" false even though both have same values?
- google-app-engine - 如果我的 Google 的 App Engine 实例尝试与 MySQL 实例建立超过 100 个并发连接,会发生什么情况?
- reactjs - 如何在同一事件下调用 setValue() 和处理提交函数?
- sql - 退回占客户总销量 80% 的顶级产品
- python - 如何导入以变量命名的文件
- excel - VBA copy formula into last row with data (based on different column) not working
- graphql - Connecting Strapi to NextJS/Apollo Client GraphQL -- Variable "$input" of required type 'XXX' was not provided
- python-3.x - Python loop on list
- mongodb - 如何使用 mongodb scala 驱动程序在 insertOne 后返回 mongodb ObjectId _id