如何在Forms身份验证中使用OAuth

Dan*_*iel 8 authentication oauth oauth-2.0 twitter-oauth facebook-oauth

有什么解决方案可以将Form auth与OAuth auth结合起来?

使用案例:

有一个用户可以使用用户名密码登录的网站,在他获得身份验证后,将提供一个令牌,这样可以在一段时间内访问应用程序中的不同资源.

现在产品负责人想要Facebook/Twitter/...认证.

可行的解决方案:

解决方案1- AssServer尝试验证Facebook票证

编辑序列图

Sin*_*tic 12

我们实际上是在我们的项目中这样做的.解决方案非常简单.这是主要观点

  • 请注意,OAuth规范建议不要在客户端上存储oauth bearer token.
  • 确保它是向oauth提供者发出身份验证请求的应用服务器.不要从客户端执行此操作(授权步骤除外,因为您实际上没有选择).
  • 利用框架.让会员提供商处理身份验证票证.
  • 创建自定义成员资格提供程序,并让它与第三方提供商一起管理身份验证过程.
  • 验证成功后,将令牌存储在会话中或具有用户身份的声明中.换句话说,保持服务器上的访问和刷新令牌.
  • 允许框架像通常那样生成auth票证
  • 在身份验证票证和会话cookie之间,您可以从会话/声明中检索访问令牌以进行资源请求.
  • 在关联第三方登录时,您显然必须使用访问令牌与提供商进行通话,以获取某些信息,例如Facebook用户ID.用它来链接你的内部用户和facebook用户.

其他需要考虑的事项:

  • 确保在注销时销毁会话.几个框架将清空cookie值,但会回收会话ID.确保会话ID未被回收.
  • 对任何需要会话信息的请求使用防伪令牌,这些请求几乎应该是所有内容.这将帮助您确保会话cookie未被劫持.

现在,我认为这是一个重点:通常,对于像facebook和twitter这样的提供商,您使用授权流程,这意味着您必须使用他们的表单登录.他们处理它,而不是你.OAuth 2.0有一个用户名/密码"option"(grant_type:password),但我不知道这些提供商是否允许它,因为该流程不需要应用程序识别自身.

我觉得你差不多了.授权授权流程将是这样的: 在此输入图像描述

密码授予流程几乎相同,但没有重定向和授权步骤.您只需使用自己的表单登录,并让服务器使用密码授予类型向提供程序发出auth请求.

如果您只是将它用于身份验证,那么您将不会向该资源服务器发出具有该特定访问令牌的请求.我需要了解更多有关您的架构的信息.但是,通常情况下,如果您有一个处理角色和身份的内部身份提供程序,您可以考虑一个联合身份提供程序,它可以将第三方令牌转换为您的内部格式,并将其与第三方令牌一起存储.这样,如果需要,您仍然可以向第三方发出请求,如果有意义的话,仍然需要在内部移动.如果这是一个问题,请告诉我,我也会解释这条腿.