1

我试图了解 OAuth2.0 Implicit Flow (with OIDC) 如何与一个非常简单的 SPA/Mobile 客户端 (aka Client) 和我的 REST Api (aka Resource Server) 一起使用并创建新帐户

我或多或少了解客户端如何从身份验证服务(Auth0/Stormpath/IdentityServer/etc)请求令牌。然后它使用这个令牌来访问受限的 API 端点。

但是我一直在阅读的所有示例都是在这些身份验证服务上创建了“帐户”(这是必需的,我理解),但在我的服务(我的资源服务器)上没有创建任何内容。

我需要在我的数据库中创建一个帐户,因为我有想要存储的用户数据/设置(例如,他们下的订单等)。当然,我不想存储任何安全信息……因为这就是我使用外部身份验证服务的原因。

那么,任何人都可以解释他们如何使用隐式流和..当返回令牌(或更具体地说,当使用 OpenID Connect 获取用户信息时)时,您会确定用户是否存在,如果是新用户则创建一个.

我还认为,从身份验证服务的角度issuer_id + sub确定用户都需要令牌。unique

最后,您如何防止“新帐户垃圾邮件/滥用”?我假设在您的客户端中的某个时刻(在每个 Rest API 请求之前检查本地存储令牌,因为我们需要在bearer标头中粘贴一些令牌)......当您决定创建一个新用户时...... .我的REST Api(又名资源服务器)将有一个端点来创建新用户..就像POST /account/..那么如何保护您的服务器免受垃圾邮件的新随机POST创建新帐户?IP+时延限制?

4

1 回答 1

1

我们在数据库中实际在哪里创建帐户?

创建一个包含issandsub列的数据库表。将这些列设置为代表用户的唯一复合键。在其中插入用户帐户。

因此,任何人都可以解释他们如何使用隐式流和.. 当返回令牌(或更具体地说,当使用 OpenID Connect 获取用户信息时)时,您可以确定用户是否存在,如果是新用户则创建一个?

听起来你已经知道答案了。

  1. 解析id_token.
  2. 检索isssub
  3. 检查您的应用程序表中的iss+sub键。
  4. 如果它在那里,那么该用户就存在。如果不是,则创建用户。

从规范:

主题标识符:本地唯一且从未在最终用户的发行者中重新分配的标识符,旨在由客户端使用。

https://openid.net/specs/openid-connect-core-1_0.html

isssub充当代表用户的唯一复合键。这是一个例子id_token

{
 alg: "RS256",
 kid: "1e9gdk7"
}.
{
 iss: "http://server.example.com",
 sub: "248289761001",
 aud: "s6BhdRkqt3",
 nonce: "n-0S6_WzA2Mj",
 exp: 1311281970,
 iat: 1311280970
}.
[signature]

以与处理任何其他唯一用户标识符相同的方式处理iss+复合键。sub

那么如何保护您的服务器免受创建新帐户的垃圾邮件的新随机 POST 的影响呢?

设置跨域资源共享 (CORS) 限制,以便只允许您的 SPA 域发布到/api/account端点。

于 2016-09-27T05:03:44.577 回答