package com.sys.controller; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.apache.oltu.oauth2.client.OAuthClient; import org.apache.oltu.oauth2.client.URLConnectionClient; import org.apache.oltu.oauth2.client.request.OAuthBearerClientRequest; import org.apache.oltu.oauth2.client.request.OAuthClientRequest; import org.apache.oltu.oauth2.client.response.OAuthJSONAccessTokenResponse; import org.apache.oltu.oauth2.client.response.OAuthResourceResponse; import org.apache.oltu.oauth2.common.OAuth; import org.apache.oltu.oauth2.common.exception.OAuthProblemException; import org.apache.oltu.oauth2.common.exception.OAuthSystemException; import org.apache.oltu.oauth2.common.message.types.GrantType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import com.cku.core.RESTResponse; import com.cku.util.ServletUtils; import com.cku.util.SysConfig; import com.sys.service.OAuthServiceImpl; /** * Created by user on 2016/4/27. */ @Controller @RequestMapping("oauth2Client") public class Oauth2ClientController { @Autowired private OAuthServiceImpl oAuthService; private static String LOCALURL = null;//"http://localhost:8888/"; private static String SERVICEURL = null;//"http://www.taochongbao.cn:8080/taochongbao/service/"; private static String CLIENTID = null;//"c1ebe466-1cdc-4bd3-ab69-77c3542b9dee"; private static String CLIENTSECRET = null;//"d8346ea2-6017-43ed-ad68-19c0f971738b"; static{ LOCALURL = SysConfig.getInstance().getProperty("localurl"); SERVICEURL = SysConfig.getInstance().getProperty("serviceurl"); CLIENTID = SysConfig.getInstance().getProperty("clientid"); CLIENTSECRET = SysConfig.getInstance().getProperty("clientsecret"); } @ResponseBody @RequestMapping("getClientId") public void getClientId(HttpServletRequest request, HttpServletResponse response) throws OAuthSystemException, IOException { RESTResponse result = null; try { result = new RESTResponse("clientId",CLIENTID); } catch (Exception e) { result = new RESTResponse(e); } ServletUtils.writeResponse(response, result); } //测试方法sendCode @RequestMapping("sendCode") public ModelAndView sendCode(HttpServletRequest request, HttpServletResponse response) throws OAuthSystemException, IOException { OAuthClientRequest oAuthRequest = OAuthClientRequest .authorizationLocation(SERVICEURL+"oauth2/authorize.do") .setClientId(CLIENTID) .setRedirectURI(LOCALURL+"oauth2Client/getAccessToken.do") .setResponseType(OAuth.OAUTH_CODE) .buildQueryMessage(); response.sendRedirect(oAuthRequest.getLocationUri()); return null; } //手机端回掉地址 @RequestMapping("getCode") public ModelAndView getCode(HttpServletRequest request, HttpServletResponse response) throws OAuthSystemException, IOException { ModelAndView mav = new ModelAndView(); String authCode = request.getParameter(OAuth.OAUTH_CODE); if(!StringUtils.isEmpty(authCode)){ System.out.printf("authCode==="+authCode); //mav.setViewName("redirect:/oauth2Client/getAccessToken.do?code="+authCode); return mav; } //不发送oauth请求,交给手机端实现 OAuthClientRequest oAuthRequest = OAuthClientRequest .authorizationLocation(SERVICEURL+"oauth2/authorize.do") .setClientId(CLIENTID) .setRedirectURI(LOCALURL+"oauth2Client/getCode.do") .setResponseType(OAuth.OAUTH_CODE) .buildQueryMessage(); response.sendRedirect(oAuthRequest.getLocationUri()); return null; } @RequestMapping("getAccessToken") public Object getAccessToken(HttpServletRequest request,HttpServletResponse response) throws OAuthSystemException, OAuthProblemException, IOException { ModelAndView mav = new ModelAndView(); String authCode = request.getParameter(OAuth.OAUTH_CODE); if(StringUtils.isEmpty(authCode)){ mav.setViewName("redirect:/oauth2Client/getCode.do"); return mav; } //使用授权码去服务端获取令牌 //if(oAuthService.checkAuthCode(authCode)){ //此处应采用XXX方法调用FavAccessTokenController获取返回的值 OAuthClientRequest oauthRequest = OAuthClientRequest .tokenLocation(SERVICEURL+"oauth2/accessToken.do") .setGrantType(GrantType.AUTHORIZATION_CODE) .setClientId(CLIENTID) .setClientSecret(CLIENTSECRET) .setRedirectURI(LOCALURL+"oauth2Client/getCode.do") .setCode(authCode) .buildQueryMessage(); OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient()); OAuthJSONAccessTokenResponse oAuthResponse = oAuthClient.accessToken(oauthRequest); String accessToken = oAuthResponse.getAccessToken(); String expiresIn = oAuthResponse.getExpiresIn().toString(); System.out.printf("accessToken======"+accessToken); System.out.printf("expiresIn======"+expiresIn); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html"); response.getWriter().write("{ \"accessToken\": \""+accessToken+"\", \"expiresIn\": \""+expiresIn+"\" }"); return null; // } //mav.setViewName("redirect:/oauth2Client/getUserInfo.do?access_token="+accessToken); } @RequestMapping("getUserInfo") public Object getUserInfo(HttpServletRequest request,HttpServletResponse response) throws OAuthSystemException, OAuthProblemException, IOException { ModelAndView mav = new ModelAndView(); String accessToken = request.getParameter(OAuth.OAUTH_ACCESS_TOKEN); if(StringUtils.isEmpty(accessToken)){ mav.setViewName("redirect:/oauth2Client/getAccessToken.do"); return mav; } OAuthClientRequest bearerClientRequest = new OAuthBearerClientRequest(SERVICEURL+"oauth2/userInfo.do") .setAccessToken(accessToken).buildQueryMessage(); OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient()); OAuthResourceResponse resourceResponse = oAuthClient.resource(bearerClientRequest, OAuth.HttpMethod.GET, OAuthResourceResponse.class); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html"); response.getWriter().write( resourceResponse.getBody()); return null; } }