如何使用 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/Auth 上避免 UIWebView
如何使用 react-redux-firebase 将 'auth' 或 'profile' 对象传递给 firestoreConnect()?