Flutter + Java Spring Boot + OAuth2 - 如何设置

问题描述 投票:0回答:1

我正在努力使用 Flutter + Java Spring Boot + OAuth2 设置一个新项目。 (我对所有这 3 个技术都很陌生,但我这样做是为了学习,所以我想专门使用这些技术,并且我不想使用像 FireBase 这样的第 3 方身份验证提供商(不想最终被锁定))。

我有很多问题,因为我找不到明确的文档,但如果有人可以指出此场景的示例/教程,那将会有所帮助。

这就是我现在的位置:

SpringBoot:

  1. Java Spring Boot,带有
    spring-boot-starter-oauth2-client
    和 web 等
  2. @EnableWebSecurity
    设置
    securityFilterChain
    - '/login' 不需要身份验证
  3. LoginController
    映射'/login'
  4. 在谷歌控制台中设置一个帐户,并将密钥添加到clientid等的
    application.property
    文件中

这似乎有效 - 我可以看到它似乎登录正常(尽管我不知道发生了什么或接下来的步骤)。

这就是问题所在。 我不确定 Flutter 应该如何连接到我的服务器进行身份验证,也不知道如何获取令牌并将其传递到我的服务器。

我不明白的是:

  1. flutter应该如何接入Spring Boot? 我有一些调用'oauth2/authorization/google'的flutter代码,我可以返回200,但响应似乎是google网页
  2. OAuth 调用是否/应该通过我的服务器? 还是Flutter直接访问Google?
  3. 是否有推荐的flutter包来处理这个问题,或者由于我没有使用提供程序,我是否需要直接使用
    http.get
  4. 我想我需要获取令牌,将其保存到
    FlutterSecureStorage
    ,然后将其设置在标头中以便对服务器进行任何调用?
  5. 在 flutter 中,我是否需要检查每个调用以查看访问权限是否已过期?

一个额外的问题是,对于 flutter 应用程序(Android/iOS/Web)访问我的服务器,大概我必须在 Java 端关闭 CORS(@CrossOrigin)? 不过我担心安全问题。

非常感谢任何指示!

java flutter spring-boot oauth-2.0
1个回答
0
投票

对带有

oauth2Login
的 Spring 客户端的请求是使用会话 cookie 进行授权的,而不是使用
Bearer
令牌进行授权。所以你必须:

  • 请小心您的移动设备在从授权服务器收到授权代码后将其发送到 Spring 后端的用户代理:出于明显的安全原因,cookie 不会在系统浏览器和应用程序内部 HTTP 客户端之间共享。因此,您必须使用 Android 应用程序链接或 iOS 智能链接从系统浏览器切换回应用程序来拦截
    redirect-uri
    并在您的应用程序中以编程方式跟踪它
  • 使用某些东西来存储会话和 CSRF cookie 并将它们正确附加到请求(仅适用于发送到 Spring 后端的请求,并且对于 CSRF 令牌,仅使用
    POST
    PUT
    PATCH
    DELETE
    )。出于安全原因,我仅将这些 cookie 存储在内存中。编写处理这些 cookie 的代码并不需要太多工作。

当您担心安全问题时:

  • 请务必使用
    oauth2Login
    在 Spring OAuth2 客户端上启用针对 CSRF 的保护。同样,它基于会话,会话是 CSRF 攻击的载体。对于移动和单页应用程序,您需要基于 cookie 的保护。
  • 即使使用 PKCE,也不要尝试使您的 Flutter 应用程序成为公共 OAuth2 客户端(直接与 Google 对话并获取令牌)。使用机密客户端比公共客户端更安全,并且令牌在服务器上更安全,远离前端代码,更重要的是远离其依赖项代码。

您应该考虑使用自己的授权服务器。当像您一样直接使用“社交”身份时,您无法管理令牌中的用户数据(大多数应用程序都需要“角色”之类的内容),并且无法管理令牌格式。此外,这将使添加更多身份源变得更加容易(更多 OpenID 提供商,如 Facebook、LDAP 等)。我写了一个教程来开始使用 Keycloak。您还可以查看 Auth0 或 Amazon Cognito 等云产品。 Spring 授权服务器是另一种选择,但可能需要比您更多的工作和对 OAuth2 和 OIDC 标准的更好了解。

如果您的后端不断增长,并且您希望将其拆分为多个(微型或非微型)相互通信的服务,您可能希望将这些服务配置为资源服务器,并在它们前面设置一个网关。在这种情况下,请查看我为其编写的 OAuth2 BFF 模式 另一个 Baeldung 教程

© www.soinside.com 2019 - 2024. All rights reserved.