如何为 React Native Bare 工作流指定重定向 URI

Posted

技术标签:

【中文标题】如何为 React Native Bare 工作流指定重定向 URI【英文标题】:How to specify the Redirect URI for React Native Bare workflow 【发布时间】:2021-03-13 22:02:50 【问题描述】:

我刚刚开始使用 Bare 工作流程(不使用 Expo 框架)构建 React Native 移动应用程序。 我已经成功地在我的应用程序上集成了登录和注销系统与 react-native-auth0 依赖项。但是,我正在努力使用 API 授权来获取经过身份验证的用户的令牌,以便控制对每个端点的访问。

我正在使用基于 Auth0 文档的 PKCE 来跟踪授权代码流程。除了前面标题中提到的重定向 uri 之外,我几乎所有东西都可以正常工作。

我尝试使用 expo-auth-session 依赖项手动指定 uri,如下所示。

const redirectUri = AuthSession.makeRedirectUri(
    native: `$REDIRECT_URI`,
    useProxy,
);

const params = 
    audience: `$AUTH0_API_AUDIENCE`,
    scope: ['openid', 'profile', 'email', 'offline_access'],
    response_type: 'code',
    client_id: `$AUTH0_CLIENT_ID`,
    redirect_uri: redirectUri,
    code_challenge: `$code_challenge`,
    code_challenge_method: 'S256',
    state: `$state`
;

但是,它返回错误消息说

错误:找不到默认返回 URL。如果您使用的是裸工作流,请提供options.returnUrl。 getDefaultReturnUrl@http://10.0.2.2:8081/index.bundle?platform=android&dev=true&minify=false:179940:24 startAsync$@http://10.0.2.2:8081/index.bundle?platform=android&dev=true&minify=false:177411:84

我已使用npx uri-scheme list 检查了我的 uri。 目前,我有一个$applicationId://。 这是否等同于redirect_uri,不是吗?

我也检查了Auth0.Android。 不过,这一定和Android Native App开发有关?! 无论如何,任何人以前使用过相同的架构?在哪里可以为使用 React Native 构建的 Android 应用程序指定重定向 URI? 我认为 Bare 工作流程不支持 AuthSession API。即使文档强调,它也阐明了裸工作流的演练,我试了一下。但是,它不起作用并引发了错误。

我相信这应该以本地方式完成?!?爪哇??我正在努力寻找解决方案,甚至不知道在哪里看。我将衷心感谢您的帮助! :-)

【问题讨论】:

【参考方案1】:

免责声明:我真的不熟悉 React Native(实际上也不熟悉移动设备),但我确实知道一些关于 OAuth 和 OIDC 的事情,并且我过去使用过 Auth0,所以这里有一些想法,希望对您有所帮助。

我已经用 npx uri-scheme 列表检查了我的 uri。目前,我有一个 $applicationId://。这是否等同于redirect_uri,不是吗?

根据 Auth0 文档,回调 URL(即到本地设备的重定向 URL)应类似于 YOUR_APP_PACKAGE_NAME://$YOUR_AUTH0_APP_NAME.auth0.com/android/YOUR_APP_PACKAGE_NAME/callback 所以我的理解是$applicationId://不等同于重定向URL,而只是它的前缀。

您是否尝试过使用$applicationId://YOUR_AUTH0_APP_NAME.auth0.com/android/$applicationId/callback (将 $YOUR_AUTH0_APP_NAME 替换为您的 Auth0 项目名称的实际值)?

【讨论】:

嗨塞巴斯蒂安!谢谢你的回答。我花更多的时间来调查这个问题,我可能不得不放弃 Auth0,这似乎与 Expo 一起不是一个很好的选择。我找不到两个技术堆栈的许多用例和许多不确定的方面。此外,由于我缺乏认证和原生开发方面的知识,在裸模式下根本找不到returnUrl(即使我在运行一个简单的代理服务器后成功获取代码)。所以我又回到了托管模式。哈哈,但是,正如我提到的,我认为它们是不兼容的,因为 expo 不太支持 Auth0 我不熟悉 Expo 对此发表评论,但简而言之,要使其在移动设备上运行,您需要您的应用程序能够“读取”重定向的 URL,例如当applicationId://anything 之类的 URL 被打开时,它应该由您的应用程序打开。此 redirectURL 是身份提供者(例如 Auth0)返回身份验证代码的位置。然后客户端(您的应用程序)可以查询 Auth0(使用 PKCE 代码)以最终获得身份验证令牌。对于 OpenID Connect(使用 Auth0 或其他提供程序),此流程将始终相同 这就是易受攻击的“公共”端(用户身份验证 + 网页)从不携带完整身份或访问令牌的方式,只有一个身份验证码,可以在安全通道上使用,以最终获得令牌您的代码将能够代表最终用户进行调用(或收集有关它们的身份信息)Tl:DR:必须始终提供redirectURL,并且必须是“允许”中允许的URL之一Auth0 应用程序的回调 URL 设置。 (此允许列表必须包含 确切 URL:无通配符,完整路径) 是的,从代理服务器获取授权码是成功的。但是,在简单的工作流程中,我无法理解 returnUrl。我怀疑这可能与 Android 中的 DeepLinking 或其他有关。由于我没有太多的原生移动开发经验,在网上找不到太多有用的信息,我不得不放弃裸露的工作流程。现在我回到了托管工作流程。如果是网页,我可以轻松获取 URL 参数。 但是,当我在移动端工作时,不确定性太多,我自己几乎得出结论,仅靠 RN 不足以构建原生应用程序。我从这次经历中学到了很多关于身份验证和授权的知识。哈哈

以上是关于如何为 React Native Bare 工作流指定重定向 URI的主要内容,如果未能解决你的问题,请参考以下文章

如何为这个 React Native Typescript 导航问题提供正确的参数

弹出 React Native 项目时,Bare 和 ExpoKit 有啥区别?

如何为 React Native 锁定设备方向

如何为 React Native 嵌套组件创建 Typescript 定义

如何为指数 create-react-native-app 配置 API 密钥

如何为 react-native-camera 使用 refreshAuthorizationStatus 函数