我在我的模型上调用“get”时遇到问题。我最初拥有权限,但我将所有内容更改为
allow.guest()
,但仍然收到未经授权的错误。
这是我的数据/resource.ts:
import { type ClientSchema, a, defineData, defineFunction } from '@aws-amplify/backend';
import { AIQuery } from "../functions/AIQuery/resource"
import { postConfirmation } from '../auth/post-confirmation/resource';
const schema = a.schema({
UserProfile: a
.model({
id: a.id().required(),
email: a.string(),
subscriptionToken: a.string(),
profileOwner: a.string(),
})
.authorization((allow) => [
allow.guest()
]),
AIQuery: a
.query()
.arguments({
query: a.string(),
apiKey: a.string(),
html: a.string(),
css: a.string(),
js: a.string()
})
.returns(a.string())
.authorization((allow) => [allow.guest()])
.handler(a.handler.function(AIQuery)),
})
.authorization((allow) => [allow.resource(postConfirmation)]);
export type Schema = ClientSchema<typeof schema>;
export const data = defineData({
schema,
authorizationModes: {
defaultAuthorizationMode: "userPool",
lambdaAuthorizationMode: {
function: defineFunction({
entry: "./subscription_auth.ts"
}),
}
},
});
And I attempt to access the data like so:
let client = generateClient<Schema>({authMode: "userPool"})
client.models.UserProfile.list(client).then((val) => {
console.log("val:", val)
})
我总是收到未经授权的错误:未授权访问类型查询的 listUserProfiles
有什么想法吗?这是正常行为吗?或者这可能是一个错误?让我知道是否有我应该发布的配置文件以提供更多信息。谢谢
好吧,我想通过查看模型中的授权规则来帮助您解决这个问题。我看到UserProfile模型有一个授权规则allow.guest(),应该允许访客用户访问,但是我们这里有一些东西,那就是没有指定允许访客用户的操作。
我注意到在defineData配置中,defaultAuthorizationMode设置为“userPool”,这意味着它需要用户身份验证
未添加附加授权模式,这将允许访客访问,例如“apiKey”
默认情况下,使用allow.guest(),但这不能包含所有操作,例如list或get
我认为有必要明确指定访客用户允许的操作,这是一个很好的做法
生成客户端时,使用的是authMode: "userPool",表示希望通过用户池进行身份验证,以访客身份访问,职责是将authMode更改为允许访客访问的模式,例如“apiKey” API配置检查:更改是为了确保API配置为接受允许访客访问的授权模式,如果API未配置为使用密钥(apiKey)用户将无法访问
请记住,任何配置更改都需要重新部署后端才能使更改生效
正确的授权配置:
defineData配置中的API密钥授权
正确指定允许的操作,例如这里添加读取操作,包括所有获取查询作为列表
export const data = defineData({
schema,
authorizationModes: {
defaultAuthorizationMode: "userPool",
additionalAuthorizationModes: ["apiKey"], // Agrega esta línea
lambdaAuthorizationMode: {
function: defineFunction({
entry: "./subscription_auth.ts"
}),
},
},
});
指定操作
UserProfile: a
.model({
id: a.id().required(),
email: a.string(),
subscriptionToken: a.string(),
profileOwner: a.string(),
})
.authorization((allow) => [
allow.guest().operations(['read']), //specifies operations
]),
let client = generateClient<Schema>({ authMode: "apiKey" });
通过修改您的代码,我们将得到这个
import { type ClientSchema, a, defineData, defineFunction } from '@aws-amplify/backend';
import { AIQuery } from "../functions/AIQuery/resource"
import { postConfirmation } from '../auth/post-confirmation/resource';
const schema = a.schema({
UserProfile: a
.model({
id: a.id().required(),
email: a.string(),
subscriptionToken: a.string(),
profileOwner: a.string(),
})
.authorization((allow) => [
allow.guest().operations(['read']),
]),
AIQuery: a
.query()
.arguments({
query: a.string(),
apiKey: a.string(),
html: a.string(),
css: a.string(),
js: a.string()
})
.returns(a.string())
.authorization((allow) => [allow.guest()])
.handler(a.handler.function(AIQuery)),
})
.authorization((allow) => [allow.resource(postConfirmation)]);
export type Schema = ClientSchema<typeof schema>;
export const data = defineData({
schema,
authorizationModes: {
defaultAuthorizationMode: "userPool",
additionalAuthorizationModes: ["apiKey"],
lambdaAuthorizationMode: {
function: defineFunction({
entry: "./subscription_auth.ts"
}),
},
},
});
客户端代码
let client = generateClient<Schema>({ authMode: "apiKey" });
client.models.UserProfile.list(client).then((val) => {
console.log("val:", val);
});
记住确保您的 API 有新密钥
amplify update api
重新部署后端
amplify push
希望这可以帮助您,让您有更清晰的想法。