飞连的授权登录和微信、QQ等授权登录实现方式类似,直接看实现步骤
1.在飞连内部创建要授权的应用
按照飞连提供的文档进行操作就可,需要注意的是回调地址,回调地址是你要接收飞连认证接口所返回code码的接口地址。
2.调用飞连的认证登录接口(/api/oidc/authorize)
这个接口可以让前端来请求,后端将地址拼接好返回给前端,以重定向到百度举例
'飞连提供的ip'/api/oidc/authorize?client_id=xxxx&redirect_uri=xxxx?url=https://www.baidu.com/&response_type=code&scope=openid
此为重定向百度的路径,按照你的情况补充即可,本地测试会涉及到内网穿透,因为飞连直接访问不到你的地址,内网穿透工具ngrok安装可看我之前文章
代码实现
我这里的callBack方法就是前面填写的回调地址接口,注意你的回调接口是一定要接收授权的code码参数,不然会提示你回调错误
url实际实现时前端会将系统回调地址传回来
code参数拼接在这里是为了重定向以后接收飞连的授权code码
重定向后是这个效果,code拼接在回调地址后
3.接下来就简单了,前端会拿到code码,将code码回传给你调用你的获取token接口(/api/oidc/token)
注意token接口需要form表单形式请求,我这里是用的restTemplate实现,还有别的方式可自行百度
public String tokenData(String code,String suffix){
String url = thisUrl + token;
String accessToken = "";
LinkedMultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("client_id",clientId);
map.add("client_secret",clientSecret);
map.add("grant_type","authorization_code");
map.add("code",code);
map.add("redirect_uri",redirectUrl+"?url="+suffix);//这里的suffix是前端把回调地址在给一遍,因为认证的回调地址和这里的回调地址必须一致,不然会报回调参数错误,应该是拿两次的回调地址做了比较
HttpHeaders headers = new HttpHeaders();
headers.add("Content-type","application/x-www-form-urlencoded");
HttpEntity<LinkedMultiValueMap<String,String>> formEntity = new HttpEntity<>(map, headers);
ResponseEntity<String> stringResponseEntity = null;
try {
ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.POST, formEntity, String.class);
String body = exchange.getBody();
Map<String, String> jsonMap = JSON.parseObject(body, new TypeReference<HashMap<String, String>>() {});
if(null != jsonMap){
accessToken = jsonMap.get("access_token");
}
} catch (RestClientException e) {
e.printStackTrace();
}
return accessToken;
}
4.获取到token以后再获取用户信息(/api/oidc/userinfo/normal)
public String userinfo(String token){
String url = thisUrl + userinfo+"?access_token="+token;
String result = null;
String jsonResult = restTemplate.getForObject(url, String.class);
if(StringUtils.isNotEmpty(jsonResult)){
JSONObject jsonObject = JSON.parseObject(jsonResult);
result = (String) jsonObject.get("email");
}
return result;
}
按照自己的实际业务获取参数就可
接下来就按照自己的实际业务处理即可
5.登出接口也是前端直接调用即可