前后端分离项目获取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是在哪个类里面定义的呢?

0
0

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;

}


0
0

Spring Security技术栈开发企业级认证与授权

Spring Security技术栈,REST风格开发常见接口,独立开发认证授权模块保证REST服务安全

2662 学习 · 1561 问题

查看课程