Java 使用google帐户对具有后端的本机桌面应用程序进行身份验证

Java 使用google帐户对具有后端的本机桌面应用程序进行身份验证,java,authentication,spring-security,google-oauth,Java,Authentication,Spring Security,Google Oauth,我有一个既有后端又有前端(java)的应用程序。我需要有用户身份验证,但我不希望自己处理大部分。所以我想我可以让用户通过他们的谷歌账户进行身份验证 后端部分主要是实现的,它可以在浏览器中正常工作: 我尝试导航到我服务器的URL,浏览器被重定向到google登录页面 我登录,浏览器被重定向回我的服务器,这次是使用身份验证信息(某种令牌?),我得到一个响应 但我很难从桌面应用程序中设置它。我希望该应用程序有一个登录按钮,当按下时,会打开系统浏览器中的谷歌登录页面供用户登录。如果登录成功,桌面客户端可

我有一个既有后端又有前端(java)的应用程序。我需要有用户身份验证,但我不希望自己处理大部分。所以我想我可以让用户通过他们的谷歌账户进行身份验证

后端部分主要是实现的,它可以在浏览器中正常工作:

  • 我尝试导航到我服务器的URL,浏览器被重定向到google登录页面
  • 我登录,浏览器被重定向回我的服务器,这次是使用身份验证信息(某种令牌?),我得到一个响应
  • 但我很难从桌面应用程序中设置它。我希望该应用程序有一个登录按钮,当按下时,会打开系统浏览器中的谷歌登录页面供用户登录。如果登录成功,桌面客户端可以使用其google帐户中的信息(例如电子邮件地址)在我的服务器上标识自己

    这是我第一次做这样的事情,所以我不知道我找对了地方。我的在线研究让我想到了OAuth2.0,但这看起来更像是授权而不是身份验证


    我看了谷歌的,它告诉我,这是适合我的用例的解决方案吗?还是对于只有前端且所有数据都保存在桌面应用程序中的应用程序?

    我不完全确定它是否安全,是否符合最佳做法,但我找到了一个解决方案。我以自己的方式使用了这个想法

  • 我在桌面应用程序上的一个随机可用端口上启动一个http侦听器,假设它是端口54321
  • 我想联系我的服务器的url。在该url中,我添加了环回端口作为查询参数。因此url类似于
    https://myserver.org:8443/signin?loopback_port=54321
  • 我使用此url启动系统浏览器。服务器需要身份验证,因此浏览器被重定向到google以登录,并为应用程序提供访问我的google帐户数据的授权
  • 登录谷歌后,浏览器会被重定向回它第一次尝试访问的我的服务器的url。现在,由于身份验证已完成,请求将通过
  • 我更新了服务器上的
    /signin
    端点,以返回重定向到
    /signn2
    (再次使用
    环回端口
    参数)。来自
    /signin
    的重定向将在浏览器的cookie中设置
    JSESSIONID
    ,当我们在
    /signn2
    中收到请求时,我们可以读取该
    JSESSIONID
  • 当我们在
    /signin2
    中获得请求时,我们使用环回端口和jsessionid构建指向桌面应用程序上http侦听器的重定向url。JSSessionID将作为查询参数包含。因此浏览器被重定向到
    http://localhost:54321/?JSESSIONID=...
  • 桌面应用程序上的http侦听器解析请求,从cookie中获取
    JSESSIONID
    ,并在随后发送到服务器的请求中使用该请求。有了这个cookie,服务器将桌面应用程序的请求与之前完成的身份验证相关联

  • 我不完全确定它是否安全,是否符合最佳实践,但我找到了一个解决方案。我以自己的方式使用了这个想法

  • 我在桌面应用程序上的一个随机可用端口上启动一个http侦听器,假设它是端口54321
  • 我想联系我的服务器的url。在该url中,我添加了环回端口作为查询参数。因此url类似于
    https://myserver.org:8443/signin?loopback_port=54321
  • 我使用此url启动系统浏览器。服务器需要身份验证,因此浏览器被重定向到google以登录,并为应用程序提供访问我的google帐户数据的授权
  • 登录谷歌后,浏览器会被重定向回它第一次尝试访问的我的服务器的url。现在,由于身份验证已完成,请求将通过
  • 我更新了服务器上的
    /signin
    端点,以返回重定向到
    /signn2
    (再次使用
    环回端口
    参数)。来自
    /signin
    的重定向将在浏览器的cookie中设置
    JSESSIONID
    ,当我们在
    /signn2
    中收到请求时,我们可以读取该
    JSESSIONID
  • 当我们在
    /signin2
    中获得请求时,我们使用环回端口和jsessionid构建指向桌面应用程序上http侦听器的重定向url。JSSessionID将作为查询参数包含。因此浏览器被重定向到
    http://localhost:54321/?JSESSIONID=...
  • 桌面应用程序上的http侦听器解析请求,从cookie中获取
    JSESSIONID
    ,并在随后发送到服务器的请求中使用该请求。有了这个cookie,服务器将桌面应用程序的请求与之前完成的身份验证相关联