我正在使用带有MobileHub的AWS Amplify库。
我连接了Cognito用户池,还有一个API网关(与Lambda函数通信)。我希望我的用户在访问资源之前签名,因此我在MobileHub用户登录页面和云逻辑页面中启用了“强制登录”。
身份验证工作正常,但是当我向API发送GET请求时,收到此错误:
"[WARN] 46:22.756 API - ensure credentials error": "cannot get guest credentials when mandatory signin enabled"
我知道Amplify会生成来宾凭据,并将这些凭据放入我的GET请求中。由于我已启用“强制登录”,因此无效。
但为什么要使用访客凭证?我已登录 - 不应该使用这些凭据吗?如何使用经过身份验证的用户信息?
干杯。
编辑:以下是Lambda函数的代码:
lambda函数:
import { success, failure } from '../lib/response';
import * as dynamoDb from '../lib/dynamodb';
export const main = async (event, context, callback) => {
const params = {
TableName: 'chatrooms',
Key: {
user_id: 'user-abc', //event.pathParameters.user_id,
chatroom_id: 'chatroom-abc',
}
};
try {
const result = await dynamoDb.call('get', params);
if (result.Item) {
return callback(null, success(result.Item, 'Item found'));
} else {
return callback(null, failure({ status: false }, 'Item not found.'));
}
} catch (err) {
console.log(err);
return callback(null, failure({ status: false }), err);
}
}
这些小助手功能:
response.js:
export const success = (body, message) => buildResponse(200, body, message)
export const failure = (body, message) => buildResponse(500, body, message)
const buildResponse = (statusCode, body, message=null) => ({
statusCode: statusCode,
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": true
},
body: JSON.stringify({
...body,
message: message
})
});
dynamodb.js:
import AWS from 'aws-sdk';
AWS.config.update({ region: 'ap-southeast-2' });
export const call = (action, params) => {
const dynamoDb = new AWS.DynamoDB.DocumentClient();
return dynamoDb[action](params).promise();
}
答案 0 :(得分:1)
您是否尝试检查SignIn请求被拒绝/容易出错的原因?
Auth.signIn(username, password)
.then(user => console.log(user))
.catch(err => console.log(err));
// If MFA is enabled, confirm user signing
// `user` : Return object from Auth.signIn()
// `code` : Confirmation code
// `mfaType` : MFA Type e.g. SMS, TOTP.
Auth.confirmSignIn(user, code, mfaType)
.then(data => console.log(data))
.catch(err => console.log(err));
你可以尝试这个,然后你就可以更容易地进行调试。
答案 1 :(得分:0)
根据有关aws-amplify issues tracker的建议,将匿名用户添加到您的cognito用户池并在您的应用中对密码进行硬编码。似乎还有其他选择,但在我看来这是最简单的。
答案 2 :(得分:0)
我正在遵循指南“serverless-stack”并且提示同样的警告消息,我正确登录并正确登出并且不明白为什么警告消息。
在我的情况下,在Amplify.configure
我跳过添加identity pool id
,这就是问题所在,User pools
和federated identities
不一样。
(英语不是我的母语)
答案 3 :(得分:0)
您必须在每次请求时都使用您的凭证才能使用AWS服务: (示例代码角度)
登录:
import Amplify from 'aws-amplify';
import Auth from '@aws-amplify/auth';
Amplify.configure({
Auth: {
region: ****,
userPoolId: *****,
userPoolWebClientId: ******,
}
});
//sign in
Auth.signIn(email, password)
请求
import Auth from '@aws-amplify/auth';
from(Auth.currentCredentials())
.pipe(
map(credentials => {
const documentClient = new AWS.DynamoDB.DocumentClient({
apiVersion: '2012-08-10',
region: *****,
credentials: Auth.essentialCredentials(credentials)
});
return documentClient.query(params).promise()
}),
flatMap(data => {
return data
})
)