目前,我正在对LinkedIn用户进行身份验证并在 Lambda 中调用GetOpenIdTokenForDeveloperIdentity
和GetCredentialsForIdentity
,并使用Auth.federatedSignIn()
登录这些用户,我能够检索当前经过身份验证的用户和凭证。
但是,使用 Amplify 的 APIClass 或 AWSAppSyncClient,我无法让这些用户通过 AppSync 进行 GraphQL 调用,AppSync 配置为授权 Cognito User Pool 和 AWS IAM 用户。当身份验证类型相应更改时,Cognito 用户池用户进行 AppSync 调用没有问题。
我已经为联盟用户尝试了以下每种方法:
API.graphql({
query: queries.getUserProfile,
variables: {
input: {
email,
}
},
authMode: 'AWS_IAM'
})
const client = new AWSAppSyncClient({
url: process.env.GRAPHQL_ENDPOINT,
region: process.env.AWS_REGION,
auth: {
type: AUTH_TYPE.AWS_IAM,
credentials: async () => Auth.currentCredentials(),
},
disableOffline: true,
});
client.query({
query: gql(queries.getUserProfile),
variables: {
input: {
email,
},
},
fetchPolicy: 'no-cache',
})
身份池是通过无服务器资源/CloudFormation 模板预配的,我设置了信任关系和经过身份验证的角色,如下所示:
ProjectAuthRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Federated: "cognito-identity.amazonaws.com"
Action:
- "sts:AssumeRoleWithWebIdentity"
Condition:
StringEquals:
"cognito-identity.amazonaws.com:aud":
- Ref: ProjectIdentityPool
ForAnyValue:StringLike:
"cognito-identity.amazonaws.com:amr": authenticated
AuthPolicy:
Type: AWS::IAM::Policy
Properties:
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- mobileanalytics:PutEvents
- cognito-sync:*
- cognito-identity:*
Resource:
- "*"
- Effect: Allow
Action:
- appsync:GraphQL
Resource:
- "*"
Roles:
- Ref: ProjectAuthRole
我已经能够通过将 @aws_iam schema 指令添加到每个类型和输入定义来进行 GraphQL 调用,但听起来这甚至不是必需的,因为授权应该发生在 AWS AppSync GraphQL API 级别。
我可能忘记配置的其他想法是什么?
看起来问题是我们的无服务器appsync插件YAML文件中additionalAuthenticationProviders
。
我的理解是,如果您希望其他身份验证提供程序(在我们的例子中为AWS_IAM
(与默认身份验证提供程序(在我们的例子中为AMAZON_COGNITO_USER_POOLS
(一起访问,则必须将架构级指令应用于架构中的类型定义。
更多详情来源: https://docs.aws.amazon.com/appsync/latest/devguide/security.html#using-additional-authorization-modes