我正在努力了解OAuth2.0隐式流(带OIDC(如何与一个非常简单的SPA/Mobile客户端(又名客户端(和我的REST Api(又名资源服务器(一起工作并创建新帐户。
我或多或少了解客户端如何从身份验证服务(Auth0/Stormpath/IdentityServer/等(请求令牌。然后,它使用此令牌访问受限制的API端点。
但我一直读到的所有例子都是,"帐户"是在这些Auth服务上创建的(这是必需的,我理解(,但在我的服务(我的资源服务器(上没有创建任何内容。
我需要在我的数据库中创建一个帐户,因为我有想要存储的用户数据/设置(例如,他们的订单等(。当然,我不想存储任何安全信息。。因为这就是我使用外部身份验证服务的原因。
那么,有人能解释一下他们是如何使用隐式流的吗。。当返回一个令牌(或者更具体地说,当OpenIDConnect用于获取用户信息时(时,您可以确定用户是否存在,并在用户是新用户时创建一个。
我还发现,令牌issuer_id + sub
都是从身份验证服务的角度确定unique
用户所必需的。
最后,如何防止"新帐户垃圾邮件/滥用"?我假设在您的客户端中的某个时刻(它在每个Rest API请求之前检查local-storage令牌,因为我们需要在bearer
头中粘贴一些令牌(。。。当你决定创建一个新用户时。。。我的RESTApi(又名资源服务器(将有一个端点来创建新用户。。如POST /account/
。。那么,如何保护你的服务器免受垃圾邮件的影响呢?新的随机POST会创建新的帐户?IP+延时限制?
我们在数据库中实际在哪里创建帐户?
创建一个包含iss
和sub
列的数据库表。将这些列设置为表示用户的唯一复合键。在其中插入用户帐户。
那么,有人能解释一下他们是如何使用隐式流的吗。。当一个令牌(或者更具体地说,当OpenIDConnect被用来获取用户信息时(被返回时,你会弄清楚一个用户是否存在,如果它是新的,你会创建一个吗?
听起来你已经知道答案了。
- 解析
id_token
- 检索
iss
和sub
- 请检查应用程序表中的
iss
+sub
密钥 - 如果它在那里,那么该用户就存在。如果不是,则创建用户
来自规格:
主题标识符:在发卡机构内为最终用户指定的本地唯一且从未重新分配的标识符,供客户使用。
https://openid.net/specs/openid-connect-core-1_0.html
CCD_ 12和CCD_ 13充当表示用户的唯一复合密钥。以下是一个示例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的域POST到/api/account
端点。