详解Oauth2.0的实现原理,手动搭建自己的Oauth服务

大家好,我是阿迈达,有趣的互联网软件工程师。专业角度分析技术原理,幽默的态度解读科技互联网资讯。



前言

Oauth是目前认证用的最多的一种方式,如果一个网站支持用别的平台用户信息登录,这中间基本都是基于Oauth实现的。Oauth的实现原理到底是怎样的?有哪几种认证方式呢?本文就将针对这些问题进行讲解,读完本文,相信你会对Oauth有一个完整的认识,也可以动手自己实现一个Oauth。


Oauth是什么

OAuth是用于授权的行业标准协议。OAuth致力于简化客户端开发人员的工作,同时为Web应用程序,桌面应用程序,移动电话和客厅设备提供特定的授权流程。Oauth发展经过了Oauth1.0和Oauth2.0的时代,Oauth1.0和Oauth2.0互相不兼容,目前广泛使用的是Oauth2.0。

OAuth在客户端与服务提供商之间设置了中间层:授权层。客户端不能直接登录服务提供商,只能登录授权层,以此将用户与客户端区分开来。客户端登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。客户端登录授权层以后,服务提供商根据令牌的权限范围和有效期,向客户端开放用户储存的资料。


详解Oauth2.0的实现原理,手动搭建自己的Oauth服务


OAuth的客户端获取用户信息是基于用户授权的,也就是说客户端要获取用户在某个平台(服务提供商)的信息,事先要经过用户的授权,Oauth的运行流程如下所示:


详解Oauth2.0的实现原理,手动搭建自己的Oauth服务

客户端首先向用户发起授权请求,用户选择需要授权给客户端的资源,同意授权登陆客户端。客户端拿到授权信息以后,向授权服务器申请AccessToken,获取到AccessToken以后,客户端就可以访问用户授权范围内的信息了。而在用户授权的这一操作中,Oauth提供了四种授权的方式,分别为:授权码模式、简化模式、密码模式、客户端模式。


授权码模式是最常用的一种授权模式。客户端和授权服务直接通过授权码来进行交互,Access_Token通过授权码获取。授权码流程如下:


详解Oauth2.0的实现原理,手动搭建自己的Oauth服务


  • 1、客户端携带client_id请求授权服务器获取授权码,跳转到用户授权登录页。
  • 2、用户确认授权,授权服务器生成授权码,携带授权码302重定向到客户端的回调地址上。
  • 3、客户端获取到授权码以后,请求授权服务器获取Access_Token。
  • 4、授权服务器返回Access_Token和Refresh_Token。
  • 5、客户端使用Access_Token访问用户授权的资源。

授权码模式可以获取到Refresh_Token,Refresh_Token可以用来刷新Access_Token的有效期,所以适合有服务端的应用程序,服务端可以保存Access_Token,不用频繁获取Access_Token。


简化模式

简化模式省去了获取授权码的步骤,客户端携带client_id直接向授权服务器获取Access_Token。授权码流程如下:


详解Oauth2.0的实现原理,手动搭建自己的Oauth服务


  • 1、客户端携带client_id请求授权服务器获取Access_Token,跳转到用户授权登录页。
  • 2、用户确认授权,授权服务器生成Access_Token,携带Access_Token 302重定向到客户端的回调地址上。
  • 3、客户端使用Access_Token访问用户授权的资源。

简化模式在客户端直接就可以 直接完成,适合于没有服务端的app。


密码模式

密码模式是基于用户名密码的授权模式,用户通过在客户端输入用户名密码,客户端携带用户名密码向授权服务器获取Access_Token,授权流程如下:


详解Oauth2.0的实现原理,手动搭建自己的Oauth服务

  • 1、用户打开客户端的登录页面,输入自己的账号密码。
  • 2、客户端携带用户名密码(原则上客户端不允许保存用户的账号信息)向授权服务器获取Access_Token。
  • 3、客户端使用Access_Token访问用户授权的资源。

密码模式是一种不安全的授权的方式,用户的密码暴露给了客户端,这种模式是用户在完全信任客户端模式的情况下完成的。


客户端模式


客户端模式是客户端直接向授权服务器获取资源信息。授权流程如下:

详解Oauth2.0的实现原理,手动搭建自己的Oauth服务

这种授权模式严格来说不属于Oauth范畴,因为整个授权过程中不涉及用户授权的操作,客户端直接向授权服务器获取资源信息。



Oauth流程分析


目前很多平台都提供了基于Oauth的授权服务,例如:QQ、微博、Google、Github等平台。网站可以接入这些平台的授权API,用户可以使用自己在这些平台的账号来授权登陆网站,我们以CSDN网站来举例说明:

打开CSDN的登陆首页,我们可以看到它支持用户使用QQ、微博、百度、脉脉等账号登陆,这些登陆方式都是基于Oauth认证方式。

详解Oauth2.0的实现原理,手动搭建自己的Oauth服务

这里我们选择使用微博授权登陆,点击微博授权登陆以后,系统会跳转到微博授权登陆页面,如下图所示:

详解Oauth2.0的实现原理,手动搭建自己的Oauth服务

观察浏览器的地址,我们发现是微博提供的Oauth认证API。


详解Oauth2.0的实现原理,手动搭建自己的Oauth服务


因为是从CSDN登陆也跳转到了微博的登陆页面,所以用户可以很放心的输入自己的用户名密码,所以这就是Oauth的魅力所在,用户并不直接向CSDN提供自己微博的用户名密码,所以是一种安全的授权模式。用户在微博登陆自己的账号以后,跳转到授权页面,如下图所示:


详解Oauth2.0的实现原理,手动搭建自己的Oauth服务


授权页面显示了用户将要授权哪些信息给CSDN,这里包括用户的个人信息(昵称、头像等基础信息)、分享内容到微博、获取评论信息等数据。授权成功以后,CSDN服务端就可以通过微博提供的API获取当前用户的以上信息。


以上就是整个Oauth的认证流程,如果我们是一个授权服务商,我们支持其它客户端通过我们应用的用户直接登录,我们需要按照以上流程提供授权服务,主要包括:

  • 1、客户端注册功能。需要接入的客户端首先需要在平台注册,平台生成client_id。
  • 2、生成授权码服务。客户端第一步发去授权的时候需要获取授权码,平台生成授权码以后302重定向到客户端,并返回授权码。
  • 3、生成Access_Token服务。
  • 4、刷新Access_Token服务。

按照以上的流程开发,就可以实现自己的授权服务。


最后

Oauth是开放的授权协议,基于Oauth我们可以很容易实现自己的授权服务,这也是目前各大开放平台的基础服务功能。通过Oauth授权,可以打通第三方应用和平台的数据互通、资源共享。而对于用户来说,不用频繁的注册各类账号,通过一个账号就可以登录各种客户端APP和网站,就如现在大多数网站都支持用微信扫码直接登录,这是互联网技术的一大进步。


分享到:


相關文章: