2

我正在为一个应用程序实现我自己的 OAuth 身份验证系统(支持 refresh_token),我对如何做到这一点有一些疑问:

  1. 客户端识别:客户端在认证服务器中注册并获得一个client_id和一个client_secret。我如何生成它?两个值之间是否存在某种关系?
  2. 用户身份验证:客户端发送users_credentials(例如用户名+密码)+ client_id并获取refresh_token(temp?)access_token。该 access_token 是我应该在进一步请求中使用的那个,或者我应该使用accesss_token` =F(refresh_token,access_token,client_secret)。在第二种情况下,F 函数由什么组成?
  3. 访问令牌刷新:客户端发送client_idrefresh_token并获得一个access_token(和一个可选的新 refresh_token)。access_token是否需要与第 2 点相同的转换(无论是什么)?

如果我错了,client_secret 何时以及如何使用?完整的答案和具体的例子将被“赏金”。

4

2 回答 2

4
  1. 当您使用它们创建帐户时(例如,当您使用 Facebook 或 Google 创建开发者帐户时),授权/身份验证服务器会生成这些值。如果你自己做这些部分,它们应该是加密安全的伪随机数字或字母。请记住,客户 ID 通常是公开可见的,因此请选择一组相当大的字母数字(我使用 30 个字符)。这个秘密是私密的,可能更难猜到,所以我选择了 30 位带有字母、数字和符号的数字。这些彼此没有关系,只是一个是公开的,另一个不是。
  2. 通常的工作方式是浏览器重定向到身份验证服务器,在 URL(和重定向 uri)中传递客户端 ID,而不是用户 ID 和密码。OAuth2 的重点是客户端系统永远不会看到用户名和密码,只有身份验证服务器。在此重定向之后,身份验证服务器验证客户端 ID,检查用户名/密码(例如),然后使用临时代码返回重定向 uri。将此临时代码传递回 Auth 服务器以获取访问令牌。由于此调用是作为来自服务器的 POST 进行的,因此它还会传递客户端密码以验证它确实是正确的客户端系统,而不是从其他地方窃取客户端 ID 的人。在此刻,
  3. 如果客户端系统想要让用户登录而不必一直输入用户名和密码,它可以使用刷新令牌(如果可用)回调到 Auth 服务器,并且如果 Auth 服务器满意刷新令牌仍然有效并且任何其他业务规则都是正确的,它可以直接给您另一个访问令牌,而无需用户参与。

我建议在这里阅读 OAuth2 规范:OAuth2 Spec RFC6749。这可能需要一段时间,但如果您删除不需要的位并减少数据量,其中有很多有用的示例。

于 2013-10-01T09:31:28.597 回答
0

首先客户端标识符可以是您想要的任何字符串,但对于每个客户端来说它应该是唯一的。如果您愿意,它甚至可以是客户的选择。客户端密码应该是一个加密的强随机字符串。以下是如何在 C# 中生成一个:

RandomNumberGenerator cryptoRandomDataGenerator = new RNGCryptoServiceProvider();
byte[] buffer = new byte[length];
cryptoRandomDataGenerator.GetBytes(buffer);
string uniq = Convert.ToBase64String(buffer);
return uniq;

其次,OAuth 的全部意义在于允许外部应用程序代表您执行操作,而无需询问您的凭据。因此,您需要实现一个身份验证服务器,该服务器部分地为您进行日志记录。用户打开应用程序并获得使用您的网站登录的选项。一旦用户输入了他的凭据,您就可以使用访问令牌和刷新令牌。然后,应用程序可以简单地使用令牌代表用户执行操作。我写了一个高效的 OAuth2.0 服务器/提供者如何工作的答案这解释了如何构造访问令牌。
请记住,刷新令牌的需求和访问令牌的生命周期完全取决于您打算如何使用它们以及您的安全框架是什么样的。

最后,刷新令牌也可以是 HMAC 编码的字符串/JSON 对象,正如我在对链接问题的回答中所解释的那样。您可以使用随机刷新令牌和大型后端存储来保存它以验证传入请求中的令牌,或者使用 HMAC 编码字符串来增加安全性/减少存储要求/延迟来解密/加密令牌。

此外,请确保您通过 Lukos 提到的所有流程和可能的 RFC。

于 2013-10-06T14:10:07.663 回答