为PHP网络应用选择正确的OAuth2授权类型
作者:互联网
我正在构建一个非常典型的Web应用程序产品.将来可能会有相应的移动应用程序.我正在使用REST API从头开始构建,该API使用OAuth2进行保护.我已经可以使用OAuth2,并且可以使用各种授权类型成功连接.
我有点困惑的是,实际的Web应用程序使用哪种授权类型.这就是我的想法:
公共API访问
在用户登录Web应用之前,需要进行某些API访问,例如用户注册和密码重置.我在考虑使用client_credientials授予类型.简单的客户端ID和秘密验证,以获取访问令牌.
但是,似乎完全没有必要为每个公共请求甚至每个会话都请求访问令牌.仅生成一个我的Web应用程序将始终使用的访问令牌似乎更有意义.
但是,这似乎与OAuth的工作方式背道而驰.例如,访问令牌过期.正确的做法是什么?
私人用户API访问
接下来,为了让用户登录到Web应用程序,我计划使用密码授予类型(资源所有者密码凭据).这种方法使我可以将user_id与访问令牌一起保存-这样我就知道哪个用户已登录.此外,通过使用作用域,我可以限制API内的访问.
我计划将访问令牌保存在PHP会话中.只要PHP会话处于活动状态,它们将保持登录到Web应用程序.
这是适合用户登录的设计吗?
解决方法:
对于公共API访问:
一种方法是一起跳过令牌,仅使用基本HTTP身份验证进行API访问.您可以为此接受客户端凭据,并限制客户端可以使用特定于客户端的作用域执行的操作. Github提供HTTP Basic authentication使用用户凭据进行所有API调用.
对于私有用户API访问:
这是一个有趣的问题,因为它开始打破身份验证和授权之间的界限. OAuth用于授权,因此登录用户变得更加轻松.例如,会话管理是OAuth2.0规范未涵盖的内容.
但是,无论如何,这是OAuth2.0的常用用法.您可以使用密码授予类型或与此相关的任何其他授予类型来获取访问令牌.一个主要的缺点是他们必须使用密码信任您的应用程序(对于您自己的应用程序来说不是什么大不了的事,但是对于第三方而言则不是很多).同样,在一个地方登录不一定意味着要在其他地方登录(不是SSO,而是“关联帐户”,因此会话是单独管理的).解决此问题的一种方法是始终将用户发送到oauth授权端点,如果他们的会话在OAuth2.0提供者端处于活动状态,则使用访问令牌或授权代码将其重新路由回客户端应用.这样,如果与OAuth2.0提供程序的会话处于活动状态,则客户端可以立即将其登录.
标签:rest,oauth-2-0,php 来源: https://codeday.me/bug/20191030/1968119.html