前后端分离项目获取access_token问题
来源:6-2 实现标准的OAuth服务提供商

weixin_慕斯卡6063904
2019-03-18
jojo老师,由APP去请求认证服务器,并得到一个10.100.125.24:8080?code=xxx,然后将这个10.100.125.24:8080?code=xxx原封不动的给到第三方Client。但是APP和第三方Client的端口号都不一致,这个redirectUrl根本就不可能一致,如果8080是后台端口,那么APP端无法拿到这个code.如果8080是APP端口,那么再用这个code拼上后台端口去请求后台,那么这个code实际上是无效的,无法获得token。
你答复:用web的前后端分离和app的前后端分离处理是不一样的,如果你是web的前后端分离,你在第一步将用户导向认证服务器时,带着的redirectUrl就应该是后台的url,也就是你的场景中的8080端口的url,这样认证服务器就直接跳回后台了,后台拿到令牌以后,直接写到cookie里或者作为参数携带着跳转到前台的url上。
具体要怎么实现呢?AccessToken是在OAuth2AuthenticationService这个类的getAuthToken方法里面获得的,难道是要重写这个方法,然后返回给前台嘛?作为Java新手,还是有点懵的,请老师详细解释下,谢谢!
2回答
-
无敌威威
2019-06-17
你的问题解决了吗?老师的这个callBack是在哪个类里面定义的呢?
00 -
JoJo
2019-03-21
不是的,前后端分离是获取token应该是你自己写代码来实现的,获取到token再跳转就可以了,下面是我们的callback代码,前台跳转时带的redirect-uri就是这个服务。
@GetMapping("/token/callback")
public void callBack(@RequestParam String code, String state, HttpServletRequest request, HttpServletResponse response) throws IOException {
if(StringUtils.isBlank(this.redirectUri)) {
redirectUri = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/token/callback";
}
TokenInfo tokenInfo = getAccessToken(code, redirectUri);
String accessToken = tokenInfo.getAccess_token();
String refreshToken = tokenInfo.getRefresh_token();
int expire = tokenInfo.getExpires_in();
Cookie accessCookie = new Cookie("accessToken",accessToken);
accessCookie.setMaxAge(expire);
accessCookie.setDomain(cookieDomain);
response.addCookie(accessCookie);
Cookie refreshCookie = new Cookie("refreshToken",refreshToken);
refreshCookie.setMaxAge(expire);
refreshCookie.setDomain(cookieDomain);
response.addCookie(refreshCookie);
String params = "?accessToken="+accessToken+"&expire="+expire+"&refreshToken="+refreshToken;
log.info("send redirect to : " + sendRedirectUri + params);
response.sendRedirect(sendRedirectUri + params);
}
/* 获取安全中心的token并放入cookie */
@SuppressWarnings("restriction")
public TokenInfo getAccessToken(String code, String redirectUri) throws UnsupportedEncodingException {
String str = clientId + ":" + clientSecret;
String encode = new BASE64Encoder().encode(str.getBytes("utf-8"));
// 设置请求头
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Basic " + encode);
LinkedMultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("grant_type", "authorization_code");
params.add("code", code);
params.add("redirect_uri", redirectUri);
log.info("redirect_uri is : "+redirectUri);
HttpEntity<LinkedMultiValueMap<String, String>> request = new HttpEntity<>(params, headers);
TokenInfo token = new TokenInfo();
try {
String tokenStr = HttpsRestTemplate.getInstance().postForObject(tokenUri, request, String.class);
log.info("token response is : " + tokenStr);
token = JSON.parseObject(tokenStr, TokenInfo.class);
} catch (HttpStatusCodeException e) {
log.info("get token fail", e.getResponseBodyAsString());
} catch (Exception e) {
log.info("get token fail", e);
}
return token;
}
00
Spring Security技术栈开发企业级认证与授权
2662 学习 · 1561 问题
相似问题