即使设置为allow.guest(),也无法在我的UserProfile模型上调用get

问题描述 投票:0回答:1

我在我的模型上调用“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

有什么想法吗?这是正常行为吗?或者这可能是一个错误?让我知道是否有我应该发布的配置文件以提供更多信息。谢谢

amazon-web-services authentication aws-lambda amazon-cognito aws-amplify
1个回答
0
投票

好吧,我想通过查看模型中的授权规则来帮助您解决这个问题。我看到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);
});
您可能会发现一些有用的 AWS 文档 https://docs.aws.amazon.com/amplify/

记住确保您的 API 有新密钥

amplify update api

重新部署后端

amplify push

希望这可以帮助您,让您有更清晰的想法。

© www.soinside.com 2019 - 2024. All rights reserved.