使用第三方OAuth2服务器

时间:2015-05-31 11:49:19

标签: java spring oauth spring-security oauth-2.0

我正在开发一个由Spring Security担保的Web应用程序。新要求是用户可以使用现有的第三方OAuth2服务器(基于授权代码授权)登录,并使用其公开的API。 例如,将我的应用程序视为电子银行网站和第三方API,作为我的应用程序调用以获取用户帐户列表的银行后端​​。

重点:

  • 授权服务器和资源服务器是同一个,并且完全在我的应用程序外部并且不受我的控制
  • 我的应用程序无法自行建立用户的身份。用户被重定向到另一个页面进行登录,如果成功,我的应用程序只会收到一个用于该用户的令牌。我猜我应该将这个令牌存储在用户的会话中,并在需要调用API时继续提交。
  • 我的应用程序中的用户一旦成功通过身份验证,就应该根据服务器分配给它的OAuth2范围获取角色

问题:

  • 我上面解释的登录流程不是正常的授权代码授权流程吗?如果是这样,Spring在获取令牌之前期望我已经拥有登录用户的理由是什么?是否有效“登录”获取令牌的行为?当授权代码授予的整个目的让用户直接向我的应用程序发送凭据时,我如何知道如何登录用户?
  • Spring希望我将用户角色映射到范围...这不是预期的完全相反吗?我不应该收到表示用户可以做什么的范围,并基于此在我的应用中分配角色吗?
  • 是否可以将服务器(和我的应用)配置为不要求用户明确授予我的应用权限?原因是我的应用程序是用户访问第三方API的唯一方式(例如,获取其银行帐户列表的唯一方法是使用我的电子银行网站),因此通过使用我的应用程序(电子银行网站),他们肯定希望它能够完成其工作(从银行后端获取他们的帐户列表)。

1 个答案:

答案 0 :(得分:1)

是的,您解释的登录流程是正确的。这正是OAuth2RestTemplate所做的 - 在会话中存储令牌。

但我完全不了解你的问题。

  1. 您是说Spring在授予身份验证代码之前强制用户登录授权服务器吗?这是正确的,因为这是允许您的应用代表他进行操作的用户。如何在没有登录的情况下授予某些东西?

  2. 我不确定Spring会强制您将用户角色映射到范围。是不是在Authorization Server中完成了限制此用户可以授予的范围?但你是对的 - 如果需要,你可以使用令牌范围将它们映射到你应用中的内部角色。

  3. 我们使用Cloudfoundry UAA来构建OAuth2授权服务器,它具有自动批准范围的概念(即不需要明确的用户批准)。你可以看一下。

  4. 我们有相同的要求,我们所做的是我们自己的自定义AuthenticationFilter(映射到redirect_uri),它正在交换收到的auth代码来访问令牌,然后使用收到的令牌和适当的内部角色创建内部身份验证。