在 SPA 中使用隐式流时,我们实际在数据库中的什么位置创建帐户?

When using Implicit Flow with a SPA, where do we actually create the account in our Database?

我正在尝试了解 OAuth2.0 隐式流程(使用 OIDC)如何与非常简单的 SPA/Mobile 客户端(又名客户端)和我的 REST Api(又名资源服务器)一起工作并创建新帐户

我或多或少了解客户端如何从 Auth 服务请求令牌 (Auth0/Stormpath/IdentityServer/etc)。然后它使用此令牌访问受限 API 端点。

但我一直在阅读的所有示例都是 'accounts' 是在这些 Auth 服务上创建的(这是必需的,我理解)但在 my 上没有创建任何内容服务(我的资源服务器)。

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

那么,有人能解释一下他们是如何使用隐式流的吗?当返回一个令牌(或者更具体地说,当使用 OpenID Connect 获取用户信息时)时,您可以判断用户是否存在,并且如果是新的,就创建一个。

我还发现令牌 issuer_id + sub 都是从身份验证服务的角度确定 unique 用户所必需的。

最后,如何预防'new account spam/abuse'?我假设在您的客户端中的某个时刻(在每个 Rest API 请求之前检查 local-storage 令牌,因为我们需要在 bearer header 中添加一些令牌) ...当您决定创建一个新用户时 ...我的 REST Api(又名资源服务器)将有一个端点来创建新用户..就像 POST /account/ ..那么怎么做保护您的服务器免受创建新帐户的新随机 POST 垃圾邮件的侵害? IP+time-delay限制?

where do we actually create the account in our Database?

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

So, can anyone explain how they use implicit flow and .. when a token (or more specifically, when OpenID Connect is used to get the user information) is returned, you figure out if a user exists or not and creates one if it's new?

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

  1. 解析 id_token
  2. 检索 isssub
  3. 检查您应用的 table 是否有 iss + sub 键。
  4. 如果存在,则该用户存在。如果不是,则创建用户。

来自规范:

Subject Identifier: Locally unique and never reassigned identifier within the Issuer for the End-User, which is intended to be consumed by the Client.

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 复合键。

so how do protect your server from getting spam'd new random POST's that create new accounts?

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