OAuth访问令牌和刷新令牌创建

时间:2013-09-27 17:41:06

标签: http oauth oauth-2.0

我正在为应用程序实现自己的OAuth身份验证系统(具有refresh_token支持),我对如何执行操作有一些疑问:

  1. 客户端识别:客户端已在auth服务器中注册,并获得 client_id client_secret 。我该如何生成它?两个值之间是否存在某种关系?。
  2. 用户身份验证:客户端发送 users_credentials (例如用户名+密码)+ client_id ,并获得 refresh_token (温度?)的access_token 即可。 access_token是我应该在进一步请求中使用的那个,或者我应该使用 accesss_token` = F(refresh_token,access_token,client_secret)。在第二种情况下,F函数包含什么?
  3. 访问令牌刷新:客户端发送 client_id refresh_token 并获取 access_token (以及可选的新refresh_token)。 access_token 是否需要相同的转化(无论如何),如第2点所述?
  4. 如果我错了,何时以及如何使用client_secret? 完整的答案和具体的例子将得到“赏识”。

2 个答案:

答案 0 :(得分:3)

  1. 授权/身份验证服务器在您创建帐户时会生成这些值(例如,当您使用Facebook或Google创建开发人员帐户时)。如果您自己做这些部分,它们应该是加密安全的伪随机数字或字母。请记住,客户端ID通常是公开可见的,因此请选择一组相当大的字母数字(我使用30个字符)。秘密是私密的,可能更难猜测所以我选择了30个数字,包括字母,数字和符号。这些是彼此无关的,只是一个是公开的而另一个不是。
  2. 通常的方法是,浏览器重定向到auth服务器,在URL中传递客户端ID(并重定向uri),特别是用户ID和密码。 OAuth2的重点是客户端系统永远不会看到用户名和密码,只看到auth服务器。在此重定向之后,auth服务器验证客户端ID,检查用户名/密码(例如),然后使用临时代码返回重定向uri。此临时代码将传递回Auth服务器以获取访问令牌。由于此调用是作为服务器的POST进行的,因此它还会传递客户端密钥以验证它是否是正确的客户端系统,而不是从其他位置窃取客户端ID的人。此时,auth服务器将返回一个访问令牌(以及可选的刷新令牌 - 您不需要使用它们,我没有。)
  3. 如果客户端系统想要在不必输入用户名和密码的情况下登录用户,则可以使用刷新令牌(如果可用)回调到Auth服务器,如果Auth服务器是很高兴刷新令牌仍然有效且任何其他业务规则都是正确的,它可以直接返回另一个访问令牌,而无需用户参与。
  4. 我建议您在此处阅读OAuth2规范:OAuth2 Spec RFC6749。这可能需要一段时间,但如果删除不需要的位并减少数据量,则会有很多有用的示例。

答案 1 :(得分:0)

第一次 client identifier 可以是您想要的任何字符串,但每个客户端都应该是唯一的。如果您愿意,它甚至可以是客户的选择。 客户端密钥应该是加密强大的随机字符串。以下是如何在C#中生成一个:

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

第二次,OAuth的重点是允许外部应用代表您做事而不要求您提供凭据。因此,您需要实现一个身份验证服务器,以便为您完成日志记录。用户打开应用程序并获得使用您的网站 登录的选项。一旦用户键入其凭据,您就会倾向于访问令牌并刷新令牌。然后,应用程序可以简单地使用令牌代表用户执行操作。我写了How would an efficient OAuth2.0 server / provider work?的答案,解释了如何构建访问令牌。
请记住,刷新令牌和访问令牌的生命周期的需求完全取决于您打算如何使用它们以及您的安全框架是什么样的。

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

此外,请确保您按照Lukos的说法检查所有流程和可能的RFC。