我想使用第三方身份验证(OpenID,可能是OAuth,但我认为OAuth适用于授权),以便用户可以轻松登录。
但是,对每个请求进行身份验证意味着我多次呼叫第三方(例如Google),即使我不需要任何东西吗?例如,我使用OpenID身份验证,但我使用的API是内部的(例如/ api / tasks / add)。
答案 0 :(得分:9)
让我们先解决一下理解问题。 OpenID和OAuth有点不同。有一种记忆不同的简单方法:
wikipedia提供了一个简单的解释:
请注意,对于OpenID,该过程从应用程序询问开始 用户的身份(通常是openid URI),而在 在OAuth的情况下,应用程序直接请求有限访问 OAuth令牌(代客密钥)用于访问用户的API(进入房屋) 代表。如果用户可以授予该访问权限,则应用程序可以 检索用于建立配置文件的唯一标识符(标识) 使用API。
所以I want to use 3rd party authentication ... that user can login easily.
可能意味着你将使用OpenID。
回答您的问题:您无需在任何请求中拨打任何第三方服务。这将是非常低效和缓慢的。 OpenID提供程序将返回用户的凭据,您很高兴。
请确保您已正确识别要求。
答案 1 :(得分:1)
OpenID Connect是一种在OAuth2之上编写的身份验证机制。客户端获得一个承载令牌,它可以在Authorization头中发送每个请求到资源服务器。
此ID令牌是由OpenID提供商签名的JWT。解码后的令牌看起来像这样:
{
"iss": "https://server.example.com",
"sub": "24400320",
"aud": "s6BhdRkqt3",
"exp": 1311281970,
"iat": 1311280970
}
因此资源服务器可以验证它,而无需联系OpenID提供程序。 OpenID提供程序具有用户端点,其中依赖方可以获取未包含在令牌中的更详细的用户信息,例如姓名和电子邮件地址。
答案 2 :(得分:1)
我相信Renat Gilmanov和flup的答案都应该对你有用,但我会尽量回答这里提出的问题。
不,这并不意味着您在每次请求时都会联系第三方网站。事实上,你不能,因为整个OpenID过程应该只发生一次给定的会话(这对用户来说是一个有点烦人的手动步骤)
我会将OpenID提供商(第三方)称为Google,因为这是您在问题中提供的示例。 身份验证将为您做的唯一事情就是让Google保证发出该特定请求的人也知道他们为您提供的Google帐户名的密码。
在此之后,由您来跟踪来自同一“人”的请求并将其视为同一帐户。基本上,无论您正在处理用户的其他“会话”信息,您现在可以假设此会话中的所有请求都来自该用户。
最常见的方法是立即将cookie传递给浏览器,其中包含您在服务器上跟踪的一些标识符,并确认无论谁通过您该cookie的人也是知道密码的人对于该Google帐户。另一种选择是发送自定义HTTP标头,这在某些方面是可取的,但手动操作比较棘手。
您可以手动构建所有这些内容,但我强烈建议您找一些库代码来尽可能多地处理这些问题。你没有提到你正在使用什么来构建这个Web应用程序(事实上,你没有明确说它是一个Web应用程序,我只是从标记问题的方式中收集到了),但有很多选择几乎你可能正在使用的每个框架或系统。
在某种程度上,如果您正在为本机移动应用程序编写API以进行连接,那么我编写的所有内容都适用。但是你可能不得不跳过一些稍微复杂的箍,以便让用户进行身份验证,因为有些OpenID提供商认为你是通过网络浏览器来的。