【问题标题】:OAuth2 Spring authentication works but not in the correct wayOAuth2 Spring 身份验证有效,但方式不正确
【发布时间】:2017-11-03 16:42:17
【问题描述】:

在过去的 2 周里,我一直坚持这一点,而谷歌也没有提供帮助。 (我不知道如何提出正确的问题以获得我需要的答案)

简单的问题是:

---------------

1) 有人可以向我解释一下我如何使资源服务器能够使用数据库而不是在内存中进行身份验证。

我试过:编辑 OAuth2Config.java: 方法 configure(ClientDetailsS​​erviceConfigurer clients) 来使用数据库,但它没有创建密钥或任何东西,但身份验证仍然有效.....

2) 也有人可以解释我如何使用 Postman/curl/(其他) 来检查身份验证是否正常工作。

解释如下

3) 另外,如果我在代码中犯了错误,或者我做错了事?请向我解释什么以及为什么我做错了。我想从错误中吸取教训。

---------------

我不得不说我是 spring 和 oauth 的新手。所以我的知识很少(我也是一名即将毕业的学生)

我正在使用 Java(Netbeans 8.2) 与 Maven 和 Spring 创建一个网上商店。我负责 API(身份验证和资源管理)

我最终需要的是一个可以调用的有效 WebshopAPI。网店本身托管在其他地方,所以我只需要 api 进行身份验证并返回 JSON,例如产品。

我使用this 作为文档/指南

Link to bitbucket repo

目前我坚持测试身份验证是否有效。当我运行应用程序并转到:localhost:8080/getallproducts,我得到一个登录屏幕。 用户名:用户,密码:[来自控制台的字符串]。我拿回产品。现在,当我打开邮递员时,我转到相同的地址和用户 oauth2 以获取密钥。我仍然得到登录屏幕而不是密钥...我不知道如何将其更改为使用客户端/密码而不是用户名/密码。

如果我错过了任何信息,请随时询问。

如果一直在寻找合适的 oauth2 起点。我发现的每一篇关于这个主题的帖子都以不同的方式做每一件事,为什么没有标准!!!我觉得这非常令人沮丧/烦人/压力很大。

【问题讨论】:

    标签: java spring spring-security oauth-2.0


    【解决方案1】:

    首先,您需要设置授权服务器:

    @Configuration
    @EnableAuthorizationServer
    protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
    
        @Autowired
        DataSource dataSource;
    
        @Bean
        public TokenStore tokenStore() {
            return new JdbcTokenStore(dataSource); // table = oauth_access_token
        }
    
        @Override
        public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
            endpoints.tokenStore(tokenStore());
        }
    
        @Override
        public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
            clients.jdbc(dataSource); // table = oauth_client_details
        }
    }
    

    不要忘记填充 oauth_client_details 表。

    资源服务器看起来不错。

    我假设你想使用授权码流程?

    邮递员

    1. 通过单击请求 URL 下方的 Auth 选项卡为请求添加授权。
    2. 类型为 OAuth2.0
    3. “获取新的访问令牌”

    填写:

    Postman 会将您重定向到用户确认页面。

    批准后邮递员将收到一个请求令牌,将其添加到请求标头中。 现在您应该可以访问资源服务器端点了。

    【讨论】:

    • 我照你说的做了。奇怪的是:当我在邮递员中填写所有内容时,您说我必须插入它,然后单击获取密钥我得到一个登录页面......为什么我会得到那个?但是当我使用用户名登录时:用户,密码:来自控制台。它会打开一个像 imgur.com/a/Yd8mH 这样的窗口。它没有返回密钥……我做错了什么吗?
    • 使用 Authorization_code 流程请求令牌时,用户需要批准代码授权。这意味着用户被重定向到他需要识别的授权服务器页面。如果不配置用户认证,spring会创建默认用户和密码。
    • 好吧,我不知道。如何配置用户身份验证?为什么我的数据库没有装满密钥?它不会创建密钥,但在控制台中它成功地验证了用户......你知道为什么会这样吗?
    • 您完全了解 OAuth2 Authorization_code 流程吗?有一个第三方应用程序想要以您的一个用户的名义使用您的 api(oauth_client_details 中的凭据)。第三方应用程序只能在 批准后以您的用户的名义执行请求。为了让您的用户批准此操作,他需要能够对您的应用程序进行身份验证。您的用户可以来自数据库、ldap、预认证、活动目录等。用户密钥/令牌仅在用户批准后生成。
    • 是的,我知道流程。我知道网店(客户端)只有在获得批准后才能访问资源(在我的情况下是来自 DB 的产品)。但是我没有在网上找到适用于我的用例的示例。 oauth 是否允许我“跳过”这一步?不是跳过而是在后台执行,所以用户看不到登录屏幕?
    【解决方案2】:

    找到了!如果你现在查看 git,你会看到一些变化。我发现当我运行应用程序时身份验证服务器没有启动。现在我将资源和身份验证服务器移动到主运行类,一切都开始工作了。感谢@JohanB

    【讨论】:

      猜你喜欢
      • 2016-01-05
      • 2013-07-20
      • 1970-01-01
      • 2013-01-02
      • 2019-01-28
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多