使用 OAuth 代码流时,如何使用用户定义的唯一标识符注册新用户?

Posted

技术标签:

【中文标题】使用 OAuth 代码流时,如何使用用户定义的唯一标识符注册新用户?【英文标题】:How can I register a new user with a user-defined unique identifier when leveraging OAuth code flow? 【发布时间】:2015-02-05 04:22:38 【问题描述】:

我正在为网站构建注册/登录流程。我打算使用 Facebook 作为我的身份提供者,而不是自己滚动。

我对 Facebook 的服务器端登录流程感觉良好:

    拨打FBlogin API获取验证码 Exchange the code 用于用户访问令牌 Inspect用户访问令牌 验证用户访问令牌详细信息

完成这些步骤后,我想检查经过身份验证的用户是否已在我的系统中注册。如果是,只需返回一个新生成的不记名令牌,以便用户可以向资源服务器发出后续请求以访问受保护的数据。

如果用户没有在系统中注册,那么我想通过创建一个数据库条目来注册他们。不过,在创建此条目之前,我想从用户那里收集一条信息。也就是说,我想让他们告诉我他们想要的“用户名”。我将使用这个唯一的用户名作为我的数据库主键。

我不能 100% 确定在创建数据库条目之前如何安全地询问用户所需的用户名。这是我的问题。 :)

我的一个想法是创建一个“兑换代码”。此代码将被加密并包含用户初始化详细信息、只有服务器知道的秘密和时间戳。像这样的:

code: 
    mySecret: "super-secret-value",
    expirationDate: "date-value",
    user:  ... ,

看到用户不在我的系统中后,我会用代码进行响应 + 将客户端重定向到他们可以指定其用户名的页面。在将他们的用户名 + 代码备份到服务器后,我可以解密代码,并验证 mySecret 以确定代码没有被篡改。如果一切正常,请使用来自兑换代码的user 信息在数据库中创建用户。最后,我会为用户生成一个新的不记名令牌并将其发送给客户端。

问题

    我建议的兑换代码策略是在创建后端数据库条目之前请求用户名的安全方式吗? 如果不是,会是什么? 如果是,在 C# 中用于此目的的安全加密/解密例程是什么?

流程序列

上面的步骤 1-4 对应于“登录”到“验证”箭头。 我提出的兑换码策略对应紫色箭头。 红色文字对应于 Facebook 特定的命名法。

注意,Stack Overflow 所做的事情与我想做的事情非常相似。在 SO 上创建您的帐户之前,它会询问您所需的显示名称(这发生在通过 Facebook、Google 等进行身份验证之后)。提交您的显示名称后,您的帐户即已注册。

【问题讨论】:

【参考方案1】:

使用开源 IdentityServer3。

无论您选择什么流程,它都已经在他们的服务器中标准化。包括(如果您想要或需要)OpenID、OAuth2 等。

【讨论】:

以上是关于使用 OAuth 代码流时,如何使用用户定义的唯一标识符注册新用户?的主要内容,如果未能解决你的问题,请参考以下文章

将 OAuth 2.0 用于 Web 服务器应用程序流时无法选择正确的通道

关于ADFS Server 2016的Oauth2的几个问题

公共第一方客户端的正确 OAuth2 流程

如何使用Oauth 2限制访问

播放广播流时如何设置 AVPLayer 的音量

使用 Spark SQL 流时缺少 Avro 自定义标头