如何使用 Firebase Auth 作为 OIDC 向 Amplify GraphQL 发出经过身份验证的请求?

Posted

技术标签:

【中文标题】如何使用 Firebase Auth 作为 OIDC 向 Amplify GraphQL 发出经过身份验证的请求?【英文标题】:How do I make authenticated requests to Amplify GraphQL using Firebase Auth as OIDC? 【发布时间】:2021-02-14 17:52:29 【问题描述】:

我需要帮助设置 Firebase Auth + Amplify GraphQL。我正在尝试使用以securetoken.google.com/PROJECT-ID 作为提供者的联合签名登录,它似乎可以登录,因为当我调用Auth.currentAuthenticatedUser() 时我得到了令牌,而在收听集线器"signIn" 事件时我得到了令牌.我的问题是向我的 GraphQL API 发出经过身份验证的请求。

const signIn = async () => 
  try 
    // already logged in using firebase so I just need to get the token from the current user
    const tokenResult = await currentUser?.getIdTokenResult()
    await Auth.federatedSignIn('securetoken.google.com/PROJECT-ID', 
      token: tokenResult?.token,
    )
    const res = await Auth.currentAuthenticatedUser()
    console.log('token', res.token) // eyjhxxxxxxxxxx...
   catch (error) 
    // ...
  

const client = new AWSAppSyncClient(
  url: AppSyncConfig.aws_appsync_graphqlEndpoint,
  region: AppSyncConfig.aws_appsync_region,
  auth: 
    type: AppSyncConfig.aws_appsync_authenticationType,
    jwtToken: () => getToken(),
  ,
)

const getToken = async () => 
  const token = await Cache.getItem('@accessToken')
  return token

当调用Auth.currentSession() 时,我得到"No current user"。另外,当我尝试获取数据时,我确实在 Authorization 标头中看到了令牌。

【问题讨论】:

请重新上传您的错误。 https://snack.expo.io/ 是 react-native 项目的好地方。 【参考方案1】:

我遇到了类似的问题,所以这里有一些你可以看看的东西。

在 AWS 控制台的 Appsync 中

https://eu-west-1.console.aws.amazon.com/appsync/home

确保您的主要授权模式设置为 Open Id Connect,如果您对主要授权模式感到满意,请添加另一个指定“OpenId Connect”的授权提供程序。

如果这不能解决问题,您可以尝试将 @aws_oidc AppSync 指令添加到您的 GraphQL 架构中。

type Query 
  getPosts:[Post!]! @aws_oidc  

type Post
  @model
  @auth(
    rules: [
       allow: owner, provider: oidc 
 ...

更多:https://aws.amazon.com/blogs/mobile/graphql-security-appsync-amplify/

最后,如果您有多个授权提供者,您可能必须将主要授权提供者切换到“OpenId Connect”——我遇到的问题是 Cognito(主要)阻止了我的辅助 API 密钥授权提供者。

更新

AWS 使用 IAM 角色来处理与安全相关的所有事情。因此,当您使用任何身份验证提供商进行身份验证时,IAM 角色将被分配给该请求,并且该 IAM 角色需要对相关资源的权限,例如对 GraphQL 查询的执行权限、扫描 DynamoDB 表等,根据此图像:

因此,您可能需要在 IAM 控制台中为相关 IAM 角色设置特定规则 - 或者至少检查它是否具有权限 - 如果没有,您还会在 Appsync GraphQL 查询控制台中收到未经授权的错误消息。

更多:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WIF.html?icmpid=docs_ddb_console

这里:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/specifying-conditions.html?icmpid=docs_ddb_console

【讨论】:

不管我改变什么,令牌仍然是未经授权的。我什至尝试通过 AppSync 查询页面,将我的令牌放在那里并未经授权给我。 您有多个授权提供商,还是只有 OpenId Connect? 您是否按照此处所述设置了用户池的 OID:docs.aws.amazon.com/cognito/latest/developerguide/…? 是的,我试过了,但还是不行,而且我只有 OIDC 进行身份验证。我现在正在尝试使用我从谷歌本身而不是 Firebase 令牌获得的idToken,但没有运气。我启用了 Google 作为提供商,还添加了 accounts.google.com 作为 OIDC 提供商。 我在答案底部用更多信息更新了答案,这里太多了。另请查看此演练:medium.com/open-graphql/…【参考方案2】:

尝试删除 aws-exports.js 中的 cookie 存储配置可能会解决问题。也许这对你有帮助。

更多讨论在这里Link-1和Link-2

【讨论】:

以上是关于如何使用 Firebase Auth 作为 OIDC 向 Amplify GraphQL 发出经过身份验证的请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何在firebase.auth(js,ts)中更新用户电话号码

如何在 Flutter 中从 Firebase Auth 获取用户 ID?

什么是 firebase 以及如何在 Android 中使用它? [关闭]

如何在Firebase中退出应用后维护用户会话

如何在 Firebase/Auth 上避免 UIWebView

如何使用 react-redux-firebase 将 'auth' 或 'profile' 对象传递给 firestoreConnect()?