前言
本文基于go-oauth2/oauth2,参考go-oauth2/oauth2/example、go-oauth2/gin-server、llaoj/oauth2,结合beego框架实现OAuth 2.0授权码方式。
介绍
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某网站上存储的资源(如邮箱、手机、头像等),而无需将用户名和密码提供给第三方应用。
OAuth2.0规定了四种授权方式,授权码、隐藏式、密码式、客户端凭证。本文主要讲解授权码方式的实现。可参考OAuth 2.0的四种方式理解。
(一)在认证和授权的过程中涉及到:
1、服务提供方,用户使用服务提供方来存储受保护的资源,如邮箱、手机、头像。
2、用户,存放在服务提供方的受保护的资源的拥有者。
3、客户端,要访问服务提供方资源的第三方应用。在认证过程之前,客户端要向服务提供者申请客户端标识。
4、授权服务,提供授权。
(二)使用OAuth 2.0进行认证和授权的过程如下所示:
实现
结合第二部分介绍,认证授权过程涉及服务提供方、用户、客户端、授权服务,这里
(一)主要涉及到接口:
1)获取code
code?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE
client_id:应用唯一标识,客户端可以请求服务提供方的资源,需要在服务提供方进行注册,生成client_id,client_secret;
redirect_uri:重定向地址;
response_type:值为code;
scope:应用授权作用域,拥有多个作用域用英文逗号(,)分隔;
state:用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,如果state不匹配,需终止oauth流程。
2)获取access_token
/access_token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&code=CODE&grant_type=authorization_code&redirect_uri=REDIRECT_URI
code:授权服务返回的code;
grant_type:值为authorization_code
3)刷新access_token
/refresh_token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
4)验证access_token
/auth?client_id=CLIENT_ID&grant_type=auth_token&access_token=ACCESS_TOKEN
5)获取用户资源
/userinfo?access_token=ACCESS_TOKEN
6)登录
/login
post方式,参数username,password
(二)关键数据表
1)客户端需要在服务提供方注册信息,
关键字段:name、redirect_uri、scope、client_id、client_secret、icon,分别表示应用名称、重定向地址、授权域、客户端id、客户端密钥、应用图标
2)服务提供方用户资源表,
比如字段:user_id、username、pwd、nickname、avatar,分别表示用户id、用户名、密码、昵称、头像
(三)代码结构
完整代码下载
注意:源码查看时,oauth2>oauth2Init.go需要调整,因为在引用的go-oauth2/redis中有涉及事务的 *** 作,为了保障事务的正确进行(尤其使用的是redis集群),需做如下调整:
效果展示
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)