1.What is the difference between authentication and authorization?
身份验证是服务器检查用户是否确实是它声称的用户的过程。这通常在用户提供用户名和密码时完成,而当第一个用户创建其帐户时,服务器将这些凭据(用户名、密码)与存储在其数据库中的凭据进行检查。
授权是指一个实体授予另一个实体执行某项操作的权限。例如,在这种情况下,当网站想要访问用户的数据时,这些数据存储和拥有在不同的网站中。
2.What is OAuth2 meant to do?
官方上,OAuth2授权用户在通过认证服务器网站AS认证后允许客户端网站C从资源服务器网站RS访问他/她的数据。这看起来很复杂,所以为了简化,一个常见的例子是用户使用他/她的 facebook 帐户登录网站。在这种情况下,客户端网站和资源服务器网站是相同的(C=RS=访问的网站),认证服务器是facebook(AS=facebook)。请注意,这是创建的,因此 C,RS 不会学习用户的密码,同时能够对他/她进行身份验证。
3.Why is OAuth2 implicit flow insecure for authentication while still secure for authorization?
隐式流程的特殊性在于,访问令牌被提供给用户代理以转发给应用程序。因此,它完全基于重定向 URI。因此,此流程不会验证应用程序的身份,因为没有客户端机密机密性(访问令牌暴露给用户和在移动设备中运行的应用程序)
4.What is the difference between OAuth2 implicit flow and Oauth2 authentication code flow and when to use which?
如前所述,在隐式流程中,访问令牌由用户代理转发给应用程序。另一方面,在授权代码流中,客户端 Web 服务器首先获取一个授权代码(在资源所有者/用户授予访问权限之后),然后使用授权代码调用 API 传递 (clientID,secretID) 以获取访问令牌。这样做是为了在 HTTP 连接(无 SSL 加密)的情况下,中间人(路由器、代理等)无法访问访问令牌。所以,第一个适用于移动应用,而后一个适用于服务器端应用。
5.Does OAuth2 authentication code flow work for authentication?
是的,授权代码流还通过身份验证服务器对用户进行身份验证。
6.Should you use OpenID instead of OAuth2 for authentication?
是的。
OpenID用于身份验证。例如,当我们希望用户能够使用一组凭据(signle-sign on)登录多个网站时。
如前所述, OAuth用于授权。请注意,可以稍微调整 OAuth(如前面的示例,其中 C=RS),以便通过授权执行(伪)身份验证。但是,如果我们只想进行身份验证,我们可以使用 OpenID。
7.Why is google saying that their "OAuth2" framework can be used for both authentication and authorization.
我想这个设计决定背后的真正原因只能由相应的谷歌工程师给出,但我可以假设他们没有同时使用 OpenID 和 OAuth,而是选择对两种用法使用单一协议,以简化事情。但是,请注意,通过 OAuth 的身份验证是通过对某人进行身份验证,通过他/她拥有的数据来完成的。一个乏味的例子是,当我试图进入我的工作大楼时,没有人问我我的证件,因为我的员工卡显然在我的脖子上。这就是通过 OAuth 进行身份验证的方式,非常简化。因此,您可以看到,这可以做出一些假设,这些假设并不总是在每种情况下都成立。而这也是一般推荐使用 OAuth 只做授权,使用 OpenID 的原因,
一个很好的链接,描述了 OAuth 的各种流程以供参考