Openid 和 RestFul API

Posted

技术标签:

【中文标题】Openid 和 RestFul API【英文标题】:Openid and RestFul API 【发布时间】:2017-10-01 18:18:47 【问题描述】:

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

但最近我实现了 Steam 登录(是的,Steam 可以充当 OpenID 提供者)。一切正常,但是如果没有发送密码,我如何在 API 上验证用户身份。

【问题讨论】:

OAuth2 Bearer 令牌怎么样? @Evert 我不知道这是什么意思,抱歉:c 那我恐怕帮不了你了。 @IanOn 你用的是什么编程语言? @BrunoPeres php,但我认为这不会改变 【参考方案1】:

您不需要用户名和/或密码来验证使用 OpenId 提供程序(在您的情况下为 Steam)登录到您网站的用户。您需要信任这个 OpenId Provider。

这是 John Christopher Jones 在一篇博文中对 OpenId 的一个很好的定义:

OpenID 是一种身份验证策略,其中未经身份验证的用户 访问您的网站,然后通过登录来验证自己 Google、Twitter、Facebook、Steam 或其他一些 OpenID 提供商。您的 服务器(OpenID 依赖方)与 OpenID 交换密钥 Provider(Google 等)然后将用户发送到 OpenID 提供者 登录。

用户使用OpenID Provider登录后,用户被退回 向您提供一些识别他们是谁的信息,由 您与 OpenID 提供者 交换的密钥。 您可以信任他们的 此时的身份并开始将他们“登录”到您自己的系统 基于他们的身份

下图显示了 OpenId 流程:

如您所见,验证凭据后,OpenId 提供者 (Steam) 会将用户发送回您的网站,包括 URL 中的凭据。有了这些凭证,您需要做的是:

    验证与此凭据关联的用户是否已存在于 数据库。如果没有,请创建它。 创建与此用户关联的 API 令牌。 为在浏览器上等待的用户(使用 RESTful API 的客户端应用)发送 API 令牌。

有了这个 API 令牌,您的客户端应用程序可以将这些令牌添加到您的 RESTful API 的每个请求中,就像使用用户名和密码的经过身份验证的用户所做的一样。请注意,您的令牌生成策略不能依赖于用户名和密码。

【讨论】:

嗯..那么 OpenID 提供者应该返回到我的 RestFul API 登录操作,如果验证成功,使用访问令牌重定向到我的网站? 不完全是。您的 RESTful API 登录操作与 OpenID 身份验证流程无关。用户在 OpenID 提供程序中成功进行身份验证后,流程将返回到您的 OpenID 客户端库配置中由您指示的 URL(或操作)。在此操作中,您应该遵循此答案中指示的 3 个步骤。我建议你用 Steam 看看 OpenID 的this example。【参考方案2】:

因此,基本上您要确保用户已通过身份验证。这里 Steam 为您的服务器提供了一个密钥(OpenID 服务器),而您的服务器已经为 OpenID 服务器提供了一个密钥。这与用于防伪攻击的令牌非常相似。 Steam 会向您的服务器提供用户的身份证明,并且您的服务器会记下 Steam 服务器的位置。然后允许用户查看您的服务器的内容。 Steam 肯定会使用 API,因此如果凭据很好地缓存在浏览器中,它以后就不会再请求它们了。

注意:HTTP 是无状态的,因此您必须使用会话来确保用户仍处于登录状态。

【讨论】:

以上是关于Openid 和 RestFul API的主要内容,如果未能解决你的问题,请参考以下文章

OpenID,如何开发提供者

appid/openid/unionid

微信开发如何获取openid

JAVA获取微信小程序openid和获取公众号openid,以及通过openid获取用户信息

微信openid会变吗

使用不同的 redirect_uri 和 openid.realm 参数从 Google OpenID 2.0 迁移到 OpenID Connect