商务服务
创建自己的OAuth2.0服务端
2025-02-18 15:03

1. 前言

创建自己的OAuth2.0服务端

本篇文章时对 客户端的授权模式-授权码模式 的创建,当然你理解的最复杂的模式之后,其他模式都是在授权码模式上面做一些小改动即可。对于授权码模式有任何的疑问,请看上面提到的文章。

注意:本文是创建OAuth的Server端,不是Client请求端。

 

2. 开始授权码模式的概念、流程

第2点其实就是复制了上一篇文章,为了提高阅读性,读过上一篇文章的可略过第2点。

授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。

流程图:

图说明:

  (A)用户访问客户端,后者将前者导向认证服务器。

  (B)用户选择是否给予客户端授权。

  (C)假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。

  (D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。

  (E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。

下面是上面这些步骤所需要的参数。

A步骤中,客户端申请认证的URI,包含以下参数:

  • response_type:表示授权类型,必选项,此处的值固定为"code"
  • client_id:表示客户端的ID,必选项
  • redirect_uri:表示重定向URI,可选项
  • scope:表示申请的权限范围,可选项
  • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。

例子:


C步骤中,服务器回应客户端的URI,包含以下参数:

  • code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
  • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。

例子:


D步骤中,客户端向认证服务器申请令牌的HTTP请求,包含以下参数:

  • grant_type:表示使用的授权模式,必选项,此处的值固定为"authorization_code"。
  • code:表示上一步获得的授权码,必选项。
  • redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。
  • client_id:表示客户端ID,必选项。

例子:


E步骤中,认证服务器发送的HTTP回复,包含以下参数:

  • access_token:表示访问令牌,必选项。
  • token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
  • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
  • refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。
  • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。

例子:


从上面代码可以看到,相关参数使用JSON格式发送(Content-Type: application/json)。此外,HTTP头信息中明确指定不得缓存。

 

3. 开始写自己的OAuth2.0服务端代码(C#)

如果有错误的地方,欢迎指正,作者也不保证完全正确。

这里介绍的是C#,当然你可以用你自己的语言写,大同小异。(没用到第三方关于OAuth2.0的框架)

作者在开始理解OAuth2.0的概念时,化了一段比较长的时间。从微信授权开始接触OAuth2.0的概念,后来写了一套第三方微信授权的小程序,慢慢消化OAuth2.0。

说实在的,OAuth2.0安全在于,提供了code、access_token,来绑定我们的用户信息。并且code、access_token有过期的时间。所以,关键在于理解code与access_token的作用。

开始代码,我们创建一个MVC的程序,这里叫做MyOAuth2Server。

 

3.1开始授权验证

第一步,开始授权验证,并且跳转到指定的授权页面。

先上代码,然后再分析:

客户端会授权会请求我们授权验证方法,

     首先,验证client_id是否可用,这里的client_id是为了保证安全性,确保请求端是服务端给予请求或者授权的权利。简单地说,就是请求端在用此服务端之前要申请唯一的一个client_id;

     然后,在把客户端传过来的信息保存在Session(你也可以保存在其他地方);

     最后,跳转到用户操作的,是否给予授权的页面(可以是点击一个确定授权的按钮,类似于微信授权。也可以是输入用户名&密码等的页面)。

下面我们看一下 return View("Authorize"); 这句代码所返回给用户许可的页面:

从上面可以看到,用户确定授权后会提交信息到Authenticate方法,下面我们看看Authenticate到底是做了什么。

 

3.2验证并返回code到请求端

我们这里是用户名与密码验证,当然你也可以用其他验证。(比如用户点击一个授权允许的按钮就可以了)

     首先,在OAuth2.0服务端上验证用户输入的用户名与密码是否正确;

     然后,生成code,并且设定code的生存时间,默认是30秒。(code只能用一次,之后要删除);

     再绑定code与用户信息(用户唯一键);

     最后,重定向回redirect_uri请求的地址,并且返回code与state。(state是请求端那边想要用于处理一些业务逻辑所用到的,当然可以为空)

上代码

上面,已经完成了code的使命,并且返回到了请求端。

下面,我们来看看怎么获取token。

 

3.3获取token

在请求端获取到code之后,请求端要获取token,因为获取了token请求端才能获取到用户信息等资料。

     首先,把token设置成不能保持cache的状态,为了保证安全性;

     然后,判断是获取token还是刷新token的状态;

     再验证code是否过期,验证client_id、client_secret是否正确;

     再生成token,把token存入容器(DB、Redis、Memory等)中;

     在通过code来获取用户的信息,把用户信息(主键)与token做绑定;

     最后,把code删除(code只能用一次,如果想再获取token只能第一步开始重新做),返回token。

上代码:

 

3.4通过token获取用户信息

上面请求端已经获取到了token,所以这里只需要验证token,token验证通过就直接返回用户信息。

验证token包括验证是否存在、验证是否过期。

 

4. 结语

到此,我们写OAuth2.0服务端的代码已经结束了。

附上源码:https://github.com/cjt321/MyOAuth2Server

下一篇将介绍请求端怎么请求我们的服务端,来测试流程、代码是否正确:http://www.cnblogs.com/alunchen/p/6957785.html

 

在上一篇文章中,我们介绍了怎么创建自己的服务器,现在我们开始写个client端,来测试。

 

我们创建一个MVC项目,叫TestOAuthClient

1. 代码开始

1)第一步,我们创建一个MainController,在Index方法里面写我们的逻辑。

2)首先获取code,如果没有code,则证明是第一步请求。

3)第一步请求,附上client_id、response_type、redirect_uri、scope、state参数。

这里我们假如服务端的第一步请求认证的地址为:http://localhost:65006/OAuth2Server/Authorize

     client_id是请求端在服务端申请的id;

     response_type为code;

     redirect_uri是告诉服务端,获取code之后返回的地址是什么;

     scope自定义;

     state自定义。

4)跳转到验证服务器。

5)验证服务器重定向会我们的请求端后(code不为空),请求获取token。

获取token需要传送返回的code、grant_type=authorization_code、client_id、client_secret

6)通过服务器返回的token,请求服务端获取用户信息。

代码就几行,如下:

 

源代码如下: https://github.com/cjt321/TestOAuthClient/

 

2. 开始调试

1)请求端(TestOAuthClient)的地址为:http://localhost:61481/Main/Index

2)在浏览器上输入上面地址,会重定向到用户是否允许授权的页面。(此页面是服务端的页面)

当我们输入正确的用户名&密码之后,会发现,再请求端能获取到用户的信息。

    以上就是本篇文章【创建自己的OAuth2.0服务端】的全部内容了,欢迎阅览 ! 文章地址:http://sicmodule.glev.cn/news/19500.html 
     资讯      企业新闻      行情      企业黄页      同类资讯      首页      网站地图      返回首页 歌乐夫资讯移动站 http://sicmodule.glev.cn/mobile/ , 查看更多   
最新新闻
如何在本地部署DeepSeek:新手向超详细教程
你是不是也想在自己的电脑上运行AI助手,而不用担心网络延迟和隐私问题?今天,我们就来手把手教你如何本地化
如何用AI写作?这4款工具一学就会
如何用AI写作?AI写作不仅丰富了我们的创作手段,还显著提升了写作效率。它能够帮助我们快速生成大量高质量的文本内容,无论是撰
AI代写说明书-学习Ai代写笔记
避坑指南:1、注意Ai输出的内容有Ai味,不能直接提供给客户2、不能陷入低时价的黑奴单,创作门槛高,时价越高,用Ai是为了节省时
ai智能拓客系统 - 快商通
ai智能拓客系统是一款能够帮助企业自动获取客户联系方式资源的营销辅助工具,支持接入各个搜索引擎平台ocpc与客户进行智能对话和
关于吃禁果的回复,DeepSeek确实不懂情感
收到一位同学的私信:这样的私信一般是不回复的,因为一是高中生不在研究范围里;二是接触的样本太少,缺乏经验。但是又一想不是
用爱在黑暗里凿出光的模样
      前一段时间在网上有看到关于DeepSeek的视频,那个时候不知道它是什么,也没有在意。直到昨晚我看到一个小姐姐的视频,
王兴兴谈AI机器人:专注与创新推动技术突破
解放周末!用AI写周报又被老板夸了!点击这里,一键生成周报总结,无脑直接抄 → https://ai.sohu.com/pc/textHome?_trans_=0300
利用DeepSeek,高效完成SCI论文撰写的全攻略
随着科研领域的不断发展,越来越多的研究者开始寻求高效撰写SCI论文的新工具。在这一背景下,DeepSeek作为一种先进的学术辅助工
DeepSeek安装教程:小白也能轻松入门,快速体验AI推理能力
在人工智能的快速发展中,DeepSeek作为新兴的AI工具,受到了广泛关注。近日,关于DeepSeek的安装与部署教程纷纷涌现,尤其是面向
推荐目前个人认为最好的文字和图片AI
因为自己写东西和日常工作运营的需求,我一直对各种小工具都比较感兴趣,也一直在努力尝试各种类型的AI工具。一、文字类:Kimi首