OAuth2标准集成方案
场景描述
使用认证服务认证并登录
实现思路
- 访问认证服务,传入回调地址 redirect_uri,回调地址格式为:https://域名/应用名/main/oauth/callback?location=要真正打开的地址,例如:PC端门户的地址为 https://域名/entry/pcapp/pc/index.w
- 认证服务器验证通过后,重定向到 redirect_uri,同时携带授权码 code
- 使用 code 调用认证服务的接口,获取授权 token
- 使用授权 token,调用认证服务的接口,获取用户信息
- 系统根据用户信息,在系统中自动注册用户,完成登录,并重定向到要真正打开的地址
实现方法
系统提供了OAuth2标准集成方案的代码:main-sso.rar。解压后,放到一个应用的 model/service 目录下。
main/src/main/java/main/controller/OauthController.java 中的 oauthcallback 方法是回调地址对应的 java 方法,这里需要传入两个参数:code 和 location。
1 实现OAuth2标准集成
只需重写main/src/main/java/main/oauth/OauthProcessorImpl.java 中的这两个方法
- 一是 onRetriveAccessToken,根据 code 获取 accessToken
- 二是 onRetriveOauthUserInfo,根据 accessToken 获取用户信息
2 登录用户关联组织内用户
在获取用户信息后,系统调用注册影子账户 registerShadowUser 方法(在main\java\main\service\UaaService.java文件中),参数说明如下,其中带星号为必填参数。如果需要使用组织内用户,则 createRealUser=false,username=用户的username
参数名 | 说明 |
---|---|
*openId | 会生成uaa中的 username,如果第三方系统唯一值为当前系统同步过去的 username,则需要做md5,否则和正式用户的 username 相同违反唯一约束 |
*appId | 对接的第三方系统的appId,例如微信登录的appid、钉钉的appid |
*type | 对接的第三方系统类型,比如 cp mp mina dingtalk |
username | 传递 username 代表不新建真实账户,直接关联 uaa 中存在的真实账户,此操作仅在第一次创建当前影子账户时有效,后续传递 username 不会切换绑定,如需切换绑定,参考解绑后重新绑定逻辑。 此操作有风险,仅支持内网调用,通过外网调用需要管理员权限 |
unionId | 相同unionid的影子账户会自动关联到同一个真实账户 |
avatar | 头像URL,例如:http://wework.qpic.cn/bizmail/iawOJt0XsjdRn6nV7Z0/0 |
nickname | 第三方系统的中文名字 |
createRealUser | 是否创建真实用户,默认自动创建,设置为false不创建 |