OAuth2原来这样用



一、理论
1、OAuth2介绍
OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。
2、OAuth2角色
OAuth2的标准定义了以下几种角色:
客户端(Client):客户端即代表意图访问受限资源的第三方应用。在访问实现之前,它必须先经过用户者授权,并且获得的授权凭证将进一步由授权服务器进行验证。
资源拥有者(Resource Owner):资源拥有者即代表授权客户端访问本身资源信息的用户,也就是应用场景中的“开发者A”。客户端访问用户帐户的权限仅限于用户授权的“范围”(aka. scope,例如读取或写入权限)。
认证服务器(Authorization Server):认证服务器验证用户身份然后为客户端派发资源访问令牌,即给客户端校验授权码和颁发 token ;
资源服务器(Resource Server):资源服务器托管了受保护的用户账号信息。
3、OAuth2认证流程
如图是OAuth2的认证流程图:
(1)、客户端向资源拥有者发起授权请求(输入自己的社交账号密码)。
(2)、资源拥有者确认客户端的授权,返回授权码。
(3)、客户端拿到授权码向认证服务器换取令牌token。
(4)、认证服务器对授权码进行身份校验,通过后发放令牌给客户端(授权码只能使用一次)。
(5)、客户端拿着令牌token去请求资源服务器。
(6)、资源服务器检验令牌token是否有效,有效返回客户端用户信息。
二、模式
OAuth2的标准定义了以下四种授权模式;
1、授权码模式
我们上面讲的内容是基于授权码模式,指的是在第三方应用中先申请一个授权码,然后用该授权码获取令牌。它被称为最安全的一种模式之一,因为获取令牌的操作是在两个服务端进行的,减少token泄露的风险。
官网流程图:
从调接口方面,简单来说:
第一步:获取code:
eg:oauthServer+"/oauth/authorize?
client_id="+clientId+"&response_type=code&redirect_uri="+redirectUrl+"&scope=all"
如果没有登录,则会跳转到统一身份认证登录页面。如果用户登录了,调用接口后,会重定向到
redirect_uri,授权码会作为它的参数
第二步:获取access_token
eg: oauthServer+"/oauth/token?code="+code+"&grant_type=authorization_code&client_secret="+clientSecret+"&redirect_uri="+redirectUri+"&client_id="+clientId
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1ODk1MzQ5NzMsInVzZXJfbmFtZS
"token_type": "bearer",
"expires_in": 59,
"scope": "all",
"user_name": "nicky",
"jti": "f2343d44-a85b-428f-9a5e-b51850053988"
}
第三步:访问系统资源,此时统一认证服务会根据该认证客户端权限信息判断,决定是否返回信
息。
访问:http://localhost:8080/api/userinfo?access_token=${accept_token}
2、简化模式
简化模式是对授权码模式进行的简化,直接跳过获取授权码的步骤,直接在浏览器中向认证服务器申请令牌。
从调接口方面,简单来说:
第一步:访问授权,要传client_id:客户端id,redirect_uri:重定向uri,response_type为token,
scope是授权范围,state是其它自定义参数
http://localhost:8888/oauth/authorize?client_id=cms&redirect_uri=http://localhost:8084/callback&response_type=token&scope=read&state=123
第二步:授权通过,会重定向到redirect_uri,access_token码会作为它的参数
http://localhost:8084/callback#access_token=${accept_token}&token_type=bearer&state=123&expires_in=120
第三步:拿到acceptToken之后,就可以直接访问资源
http://localhost:8084/api/userinfo?access_token=${accept_token}
3、密码模式
密码模式中,用户需要将账户和密码提供给客户端向认证服务器申请令牌,所以该种模式需要用户高度
信任客户端。
从调接口方面,简单来说:
第一步:直接传username,password获取token
http://localhost:8888/oauth/token?client_id=cms&client_secret=secret&username=admin&password=123456&grant_type=password&scope=all
第二步:拿到acceptToken之后,就可以直接访问资源
http://localhost:8084/api/userinfo?access_token=${accept_token}
4、客户端模式
客户端模式适用于没有前端的命令行应用,即在命令行下请求令牌
从调接口方面,简单来说:
第一步:获取token
http://localhost:8888/oauth/token?client_id=cms&client_secret=123&grant_type=client_credentials&scope=all
第二步:拿到acceptToken之后,就可以直接访问资源
http://localhost:8084/api/userinfo?access_token=${accept_token}
三、实战
OAuth2在慧安蜂巢物联网操作系统平台中的应用,采用的是让用户在系统管理员中自行配置的方式,目前系统适配Github,我们使用Github为案例。
1、Github配置OAuth2
(1)、登录github账号,右上角个人中心选择Settings -> develop Settings -> OAuth Apps -> New OAuthApp
(2)、Application name 自定义名称;Home URL 项目地址;Authorization callback URL 回调地址,项目 ip+ /login/oauth2/code/;
点击确定,如图
(3)、选择Generate a new client secret 创建密钥,记录ClientId和Client Secrests,保存。
2、慧安蜂巢配置OAuth2
(1)、登录系统管理员账户 ->系统配置 -> OAuth2 -> 启动OAuth2 -> 添加
协议按着部署的网络协议选择http还是https,重定向URL模板就是GitHub上配置得回调地址,供应商选择Github,用户组端ID和用户组机密为上一步github中得ClientId和Client Secrests,保存。
(2)、退出登录,首页就能看到使用Github登录得入口啦,点击使用Github登录,输入你的Github账户密码即可登录
四、总结
本文从理论、认证流程出发,对OAuth2进行了相关讲解,给大家带来初步得认识,并且给大家讲解了授权码模式、简化模式、密码模式、客户端模式,我们慧安蜂巢物联网操作系统平台的OAuth2就是基于授权码模式进行开发的,并且实战接入Github教大家如何使用慧安蜂巢物联网操作系统平台的OAuth2应用。