当前位置: 首页 > 知识库问答 >
问题:

对于移动应用程序来说,OAuth 2.0的正确流程是什么

范建华
2023-03-14

我试图在使用OAuth2.0的移动应用程序的Web API中实现委托授权。根据规范,隐式授权流不支持刷新令牌,这意味着一旦某个访问令牌在特定时间内被授予,用户必须在令牌到期或被撤销时再次授予该应用程序的权限。

共有1个答案

井嘉胜
2023-03-14

澄清:手机App=原生App

正如其他评论和一些在线消息来源所述,隐式似乎很适合移动应用程序,但最好的解决方案并不总是一目了然(事实上,出于下面讨论的原因,隐式不被推荐)。

原生应用OAuth2最佳实践

引用第8.2节https://www.rfc-editor.org/rfc/rfc8252#section-8.2

OAuth2.0隐式授权授权流(定义在OAuth2.0[RFC6749]4.2节中)通常适用于在浏览器中执行授权请求并通过基于URI的应用程序间通信接收授权响应的实践。
但是,由于隐式流不能受到PKCE[RFC7636](这在8.1节中有要求)的保护,因此不建议在本机应用程序中使用隐式流。

通过隐式流授予的访问令牌也不能在没有用户交互的情况下刷新,这使得授权代码授予流--它可以发出刷新令牌--对于需要刷新访问令牌的本机应用程序授权来说是更实用的选择。

授权代码

如果您确实使用授权代码,那么一种方法是通过您自己的web服务器组件进行代理,该组件使用客户机秘密来丰富令牌请求,以避免将其存储在设备上的分布式应用程序上。

以下摘录自:https://dev.fitbit.com/docs/oauth2/

下面是https://auth0.com/blog/oauth-2-best-practions-for-native-apps/

另一个是https://www.oauth.com/oauth2-servers/oauth-native-apps/

当前行业的最佳实践是使用授权流,同时省略客户端机密,并使用外部用户代理来完成授权流。外部用户代理通常是设备的本机浏览器(与本机应用程序有一个单独的安全域),因此应用程序无法访问cookie存储、检查或修改浏览器内的页面内容。

PKCE考虑因素

您还应该考虑PKCE,这里对其进行了描述https://www.oauth.com/oauth2-servers/PKCE/

具体地说,如果您也在实现授权服务器,那么https://www.oauth.com/oauth2-servers/oauth-native-apps/checklist-server-support-native-apps/声明您应该

    null

任何嵌入OAuth2.0身份验证页面的尝试都将导致您的应用程序被禁止使用Fitbit API。

出于安全考虑,OAuth2.0授权页面必须显示在专用的浏览器视图中。Fitbit用户只有在拥有浏览器提供的工具(如URL栏和传输层安全(TLS)证书信息)的情况下,才能确认他们正在通过正版Fitbit.com站点进行身份验证。

对于本机应用程序,这意味着授权页必须在默认浏览器中打开。本机应用程序可以使用自定义URL方案作为重定向URI,将用户从浏览器重定向回请求权限的应用程序。

嵌入式用户代理通常通过Web视图实现,是授权本机应用程序的一种替代方法。然而,根据定义,它们对第三方使用是不安全的。它们涉及到用户使用完整的登录凭据进行登录,只是将它们的范围缩小到功能不太强大的OAuth凭据。

即使被可信的第一方应用程序使用,嵌入式用户代理也会通过获得比它们所需的更强大的凭据来违反最小特权原则,从而可能增加攻击面。

在典型的基于Web视图的嵌入式用户代理实现中,宿主应用程序可以:记录在表单中输入的每一次击键,以捕获用户名和密码;自动提交表单并绕过用户同意;复制会话cookie,并使用它们作为用户执行经过身份验证的操作。

授权服务器应该考虑采取步骤,在可能的情况下检测并阻止通过不是它们自己的嵌入式用户代理进行的登录。

这里还提出了一些有趣的问题:https://security.stackexchange.com/questions/179756/why-are-developers-using-embedded-user-agents-for-third-party-auth-what-are-the-a

 类似资料:
  • 问题是,从性能上看,这些选项中的哪一个(显然,可能还有第三个我们没有考虑)是最好的。我认为第二种选择我看到了几个缺陷,但我不确定。就延迟和速度而言,遍历数组(如果添加了服务,或者由于用户首先使用了service2,然后使用了Service1),遍历数组的次数会更多)比选项1要高得多。此外,一个用户在一个服务下,这意味着要遍历整个数组,寻找并消除它。我不知道你是专家,你有什么建议吗?所有这些都将上传

  • 我有下面的版本。格雷德尔在我的项目中 文件。实际上,这个Oracle JDBC依赖项导入多个JAR,它们之间有更多冲突文件(内容不同)(例如和此目录中的其他文件)。 当DuplicatesStrategy设置为WARN时,Oracle驱动程序将覆盖SQL Server JDBC驱动程序的。覆盖此(和其他)文件会产生什么后果? 我应该如何处理这些重复文件?有没有办法从所有jar中获取所有文件?jar

  • 我刚刚遇到了一个奇怪的问题,这是我第一次在服务器上部署spring boot应用程序 像往常一样,我使用java命令java-jar myApp运行应用程序。罐子 过了一会儿,我看到应用程序停止了,没有留下任何错误消息。 所以我不知道问题出在哪里, 可能的原因是java内存不够,所以我将其增加到7GB,因为它有套接字 但问题依然存在 请注意,我没有docker,服务器是Amazon light s

  • 我有一个quarkus应用程序,当我用下面的命令构建应用程序时,进程第一次开始完美地编译quarkus:dev-DskipTests=true 成功启动的日志: 但是当我停下来重新开始这个过程时,过程并没有开始... 启动失败的日志: 当我尝试重新启动机器,然后启动quarkus服务时,它会再次工作。 pom。xml: 如果有人遇到过类似的行为,请告诉我,这可能是什么根源。

  • 我开始学习JSP和Tomcat容器,并且知道目录必须如何存储,但有几件事让我感到困惑: 如果我们只使用web app,为什么我们需要这里的其余文件夹?(突出显示为蓝色)。我可以只是删除他们和加载我的项目“web”作为根?

  • 问题内容: 对于具有所有带有公共静态方法的实用程序类,正确的方法是什么? 我应该使用最终班还是抽象班? 请提出建议。 例如: 要么 问题答案: 有自己的目的。如果您希望其他类()实现某些类功能,则可以使用abstract。 如果它只是实用程序类,但是您不希望其他类将其子类化,那么我将选择类。如果实用程序类只有方法,则您无法以任何方式覆盖它们,因此将它们也包含在类中也没有区别。