Openid 和 RestFul API

6

我的网站有一个Restful API,需要进行身份验证。当用户登录网站时,会执行HTTP基本身份验证(用户名和密码),并返回在API中生成的访问令牌。

但最近我已经实现了Steam登录(是的,Steam可以作为OpenID提供者)。一切都好,但如果没有发送密码,我如何在API上对用户进行身份验证呢?


@Evert 我不知道这是什么意思,抱歉 :c - user6513042
@Ian,你在用什么编程语言? - Bruno Peres
@BrunoPeres 我认为是 PHP,但我不确定是否有变化。 - user6513042
根据您使用的策略,您将采取相应的行动... 以前您使用HTTP基本身份验证,这就是为什么每当用户未经身份验证时都会重定向到登录页面。现在,您正在更改策略以使用OpenId... 因此,您不再需要生成令牌,因为Steam API将为您提供令牌。您必须在原来用于生成和授予用户访问权限的令牌位置上使用此新令牌。为此,您需要更好地了解JWT的工作原理。 - Gi1ber7
好的。我已经创建了一个流程,其顺序如下:首先用户将被重定向到Steam的OpenID URL,用户提供凭据,如果正确:Steam将重定向到/api/login,参数将被验证,如果正确,将重定向到网站并返回一个JWT令牌。 - user6513042
显示剩余2条评论
2个回答

2
“您不需要用户名和/或密码来验证使用OpenId提供程序(在您的情况下为Steam)登录您的网站的用户。您需要的是相信这个OpenId提供者。”
“这是John Christopher Jones在博客文章中对OpenId的非常好的定义。”
OpenID是一种身份验证策略,未经身份验证的用户访问您的网站,然后通过登录到Google、Twitter、Facebook、Steam或其他OpenID提供者进行身份验证。您的服务器(OpenID Relying Party)与OpenID提供者(例如Google)交换密钥,然后将用户发送到OpenID提供者进行登录。用户使用OpenID提供者登录后,他们会带着一些信息返回到您这里,用于识别他们的身份,并由您与OpenID提供者交换的密钥进行签名。此时,您可以信任他们的身份并基于其身份开始“登录”到自己的系统中。下面的图片展示了OpenID的流程:

OpenId Flow

如您所见,在验证凭据后,OpenId提供者(Steam)会将用户带回您的网站,并在URL中包含凭据。拿到这些凭据后,您需要做的是:
  1. 验证数据库中是否已存在与此凭据关联的用户。如果不存在,则创建。
  2. 创建与该用户关联的API令牌。
  3. 将API令牌发送给等待浏览器的用户(消耗您的RESTful API的客户端应用程序)。
拿到这个API令牌后,您的客户端应用程序可以将这个令牌添加到对您的RESTful API的每个请求中,就像使用用户名和密码进行身份验证的已认证用户一样。请注意,您的令牌生成策略不能依赖于用户名和密码。

那么,OpenID提供者应该返回到我的RestFul API登录操作,如果验证成功,则使用访问令牌重定向到我的网站? - user6513042
不完全是这样。您的RESTful API登录操作与OpenID身份验证流程无关。用户在OpenID提供程序中成功进行身份验证后,流程将返回到您在OpenID客户端库配置中指定的URL(或操作)。在此操作中,您应该按照此答案中指示的3个步骤进行操作。我建议您查看此Steam OpenID的示例。此处 - Bruno Peres

2
基本上,您希望确保用户已通过身份验证。在此过程中,Steam向您的服务器提供了一个密钥(OpenID服务器),而您的服务器也向OpenID服务器提供了一个密钥。这非常类似于用于反伪造攻击的令牌。Steam向您的服务器提供用户的身份信息,并将Steam服务器的位置记录在您的服务器上。然后允许用户查看您的服务器内容。Steam肯定使用API,所以如果凭证在浏览器中被缓存,它将不会在未来询问它们。
注意:HTTP是无状态的,因此您必须使用会话来确保用户仍然处于登录状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接