首页 文章

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

提问于
浏览
2

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

  • 客户端标识:客户端在auth服务器中注册并获得 client_idclient_secret . 我该如何生成它?两个 Value 观之间是否存在某种关系?

  • 用户身份验证:客户端发送 users_credentials (例如用户名密码) client_id 并获取 refresh_token(temp?)access_token . access_token是我应该在进一步请求中使用的那个,或者我应该使用 accesss_token` = F(refresh_token,access_token,client_secret) . 在第二种情况下,F函数包含什么?

  • 访问令牌刷新:客户端发送 client_idrefresh_token 并获取 access_token (以及可选的新刷新标识) . access_token 是否需要相同的转换(无论它是什么),如第2点?

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

2 回答

  • 0
    • 授权/身份验证服务器在您创建帐户时生成这些值(例如,当您使用Facebook或Google创建开发人员帐户时) . 如果你自己做这些部分,它们应该是加密安全的伪随机数字或字母 . 请记住,客户端ID通常是公开可见的,因此请选择一组相当大的字母数字(我使用30个字符) . 秘密是私密的,可能更难猜测所以我选择了30个数字,包括字母,数字和符号 . 这些是彼此无关的,只是一个是公开的而另一个不是 .

    • 这种方法的常用方法是有一个浏览器重定向到auth服务器,在URL中传递客户端ID(并重定向uri),特别是用户ID和密码 . OAuth2的重点是客户端系统永远不会看到用户名和密码,只看到auth服务器 . 在此重定向之后,auth服务器验证客户端ID,检查用户名/密码(例如),然后使用临时代码返回重定向uri . 此临时代码将传递回Auth服务器以获取访问令牌 . 由于此调用是从服务器发出的POST,它还传递客户端密钥以验证它确实是正确的客户端系统,而不是从其他地方窃取客户端ID的人 . 此时,auth服务器将返回一个访问令牌(和可选的刷新令牌 - 您不需要使用它们,我没有) .

    • 如果客户端系统想要记录用户而不必一直输入用户名和密码,它可以使用刷新令牌(如果有的话)回调到Auth服务器,如果Auth服务器很满意刷新令牌仍然有效且任何其他业务规则都是正确的,它可以直接返回另一个访问令牌,而无需用户参与 .

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

  • 3

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

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

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

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

    另外,请确保您按照Lukos的说明浏览所有流程和可能的RFC .

相关问题