【问题标题】:oauth grant type for android native app with spring boot backend带有 Spring Boot 后端的 android 本机应用程序的 oauth 授权类型
【发布时间】:2019-08-18 07:10:15
【问题描述】:

我在后端有一个 android 本机应用程序作为客户端和 Spring Boot 服务,带有 REST 端点。我想知道使用 oAuth2 进行身份验证的最佳策略(没有社交登录方法)。

我目前正在使用 spring oauth 安全性并已启动并运行授权服务器(用户使用电子邮件和密码注册)。我使用授权类型“密码”来获取 android 应用程序中的访问令牌。但是,这种方法需要 android 应用在请求中发送客户端 ID 和密码。我读了一些posts,这表明这种授权类型并不理想。我不介意接收用户的密码,但我认为将客户端密码存储在应用程序中并不是一个好方法。

另一种方法是使用授权代码授权流程,但在这种情况下,由于我只有本机应用程序和后端 API,我不知道如何授权用户。用户看到要求他们授权应用程序的浏览器页面似乎不是一种无缝体验。这也没有意义,因为这不是第三方应用程序。

我发现了一个post,人们建议在其中使用带有 PKCE 的授权码流。但这显然不适用于spring

所以,现在我想知道其他本地移动应用程序如何处理身份验证?他们不使用访问令牌吗?在处理移动应用和 Spring 后端时,我如何才能最好地支持身份验证?

【问题讨论】:

    标签: android spring-security oauth-2.0 spring-security-oauth2


    【解决方案1】:

    Spring Security OAuth 支持passwordauthorization_codewithout the client secret,意思是“公共客户端”。由于您拥有授权服务器本机应用程序并且您可以接受本机应用程序获取凭据,因此让您的本机应用程序使用带有 @987654326 的公共客户端是合理的@授予类型。

    如果您决定您的本机应用程序不应该使用凭据,那么 PKCE 是当前的最佳实践。建议将 authorization_code 流与公共客户端一起使用 alternative to PKCE

    自最初编写规范以来,行业最佳实践已更改为建议对本机应用程序使用无秘密的授权代码流。

    正如你所说,这意味着jumping out to a browser

    【讨论】:

    • 所以我想传统的 oauth 不能像在移动客户端中那样使用。如果我想为移动客户端使用 oauth,我将不得不在安全性(不让用户通过浏览器)和可用性之间做出选择。我还没有看到一个应用程序跳到浏览器进行授权,除非一个人试图从不同的服务提供商(谷歌,facebook)登录,那么应用程序通常使用什么样的身份验证机制?
    • 对不起,我不清楚答案如何无法解决您的后续问题。如果您拥有授权服务器和本机应用程序,并且您可以在应用程序中接受凭据,那么 OAuth 支持使用公共客户端(没有秘密的客户端)授予密码。这不能解决您的担忧吗?
    • 感谢您的信息,这实际上是我所需要的。但我找不到这种方法的工作示例。即,对公共客户端使用密码授权。我现在是在 x-www-form-urlencoded 请求中将 client_id 作为参数连同用户凭据一起发送?还是根本不发送?这些都不适合我。
    • 我认为这是一个新问题,这很好,但我建议在它自己的 SO 问题中提出它。这样做的原因是,有这个问题的人(使用公共客户端的密码授权)可以在谷歌搜索时更容易地找到它。随意在这里链接。对您的问题的快速(可能不完整)答案是默认情况下客户端身份验证是使用基本身份验证完成的,因此您可能希望以这种方式发送它。如果您最初的问题(我怎样才能最好......)得到回答,请再次接受这个答案,以便人们更容易找到它。
    • 我尝试了标记链接中提到的解决方案,但没有一个对我有用,我一直收到 401。
    猜你喜欢
    • 2018-05-18
    • 2019-02-11
    • 2019-07-05
    • 2021-05-14
    • 1970-01-01
    • 2021-09-27
    • 2022-08-09
    • 2018-07-04
    • 2015-01-12
    相关资源
    最近更新 更多