@Controller

public class Controller1 {

@Autowired

private OAuth2ClientContext context;

@Bean

@Scope("session")

public OAuth2ClientContext createContext(){

OAuth2ClientContext context = new DefaultOAuth2ClientContext();

return context;

}

@ResponseBody

@RequestMapping("/weixin/authorize")

public Object getUserInfo(HttpServletRequest request){

class WeixinAuthorizationCodeAccessTokenProvider extends AuthorizationCodeAccessTokenProvider{

public WeixinAuthorizationCodeAccessTokenProvider(List<HttpMessageConverter<?>> messageConverters){

this.setMessageConverters(messageConverters);

this.setTokenRequestEnhancer(new RequestEnhancer() {

@Override

public void enhance(AccessTokenRequest request, OAuth2ProtectedResourceDetails resource,

MultiValueMap<String, String> form, HttpHeaders headers) {

String clientId = form.getFirst("client_id");

String clientSecret = form.getFirst("client_secret");

form.set("appid", clientId);

form.set("secret", clientSecret);

form.remove("client_id");

form.remove("client_secret");

}

});

}

@Override

public OAuth2AccessToken obtainAccessToken(OAuth2ProtectedResourceDetails details,

AccessTokenRequest request) throws UserRedirectRequiredException, UserApprovalRequiredException,

AccessDeniedException, OAuth2AccessDeniedException {

try {

return super.obtainAccessToken(details, request);

} catch (UserRedirectRequiredException e) {

Map<String, String> params = e.getRequestParams();

String clientId = params.get("client_id");

params.put("appid", clientId);

params.remove("client_id");

throw e;

}

}

};

class WeixinOAuth2RestTemplate extends OAuth2RestTemplate{

public WeixinOAuth2RestTemplate(AuthorizationCodeResourceDetails resource , OAuth2ClientContext context){

super(resource , context);

List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();

messageConverters.add(new MappingJackson2HttpMessageConverter(){

@Override

protected boolean canRead(MediaType mediaType) {

return true;

}

});

this.setMessageConverters(messageConverters);

this.setAccessTokenProvider(new WeixinAuthorizationCodeAccessTokenProvider(messageConverters));

}

@Override

protected URI appendQueryParameter(URI uri, OAuth2AccessToken accessToken) {

uri = super.appendQueryParameter(uri, accessToken);

String url = uri.toString();

if(url.contains("$openid$")){

String openid = (String)accessToken.getAdditionalInformation().get("openid");

try {

uri = new URI(url.replace("$openid$", openid));

} catch (URISyntaxException e) {

e.printStackTrace();

}

}

return uri;

}

}

AuthorizationCodeResourceDetails resource = new AuthorizationCodeResourceDetails();

resource.setAuthenticationScheme(AuthenticationScheme.form);

resource.setClientAuthenticationScheme(AuthenticationScheme.form);

resource.setClientId("xxxxxxxxxxx");

resource.setClientSecret("xxxxxxxxxxx");

resource.setUserAuthorizationUri("https://open.weixin.qq.com/connect/oauth2/authorize");

resource.setAccessTokenUri("https://api.weixin.qq.com/sns/oauth2/access_token");

resource.setScope(Arrays.asList("snsapi_userinfo"));

context.getAccessTokenRequest().setCurrentUri(request.getRequestURL().toString());

// resource.setPreEstablishedRedirectUri("http://www.baidu.com");

// resource.setUseCurrentUri(false);

OAuth2RestTemplate template = new WeixinOAuth2RestTemplate(resource , context);

String url = "https://api.weixin.qq.com/sns/userinfo?lang=zh_CN&openid=$openid$";

ResponseEntity<Object> result = template.getForEntity(url, Object.class);

return result.getBody();

}

}

Spring-Security-OAuth2微信网页授权的更多相关文章

  1. Spring Security OAuth2.0认证授权二:搭建资源服务

    在上一篇文章[Spring Security OAuth2.0认证授权一:框架搭建和认证测试](https://www.cnblogs.com/kuangdaoyizhimei/p/14250374. ...

  2. Spring Security OAuth2.0认证授权三:使用JWT令牌

    Spring Security OAuth2.0系列文章: Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二: ...

  3. Spring Security OAuth2.0认证授权四:分布式系统认证授权

    Spring Security OAuth2.0认证授权系列文章 Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授 ...

  4. Spring Security OAuth2.0认证授权五:用户信息扩展到jwt

    历史文章 Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二:搭建资源服务 Spring Security OA ...

  5. Spring Security OAuth2.0认证授权六:前后端分离下的登录授权

    历史文章 Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二:搭建资源服务 Spring Security OA ...

  6. Spring Security OAuth2.0认证授权一:框架搭建和认证测试

    一.OAuth2.0介绍 OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不 需要将用户名和密码提供给第三方应用或分享他们数据的所有内容. 1.s ...

  7. Spring security OAuth2.0认证授权学习第四天(SpringBoot集成)

    基础的授权其实只有两行代码就不单独写一个篇章了; 这两行就是上一章demo的权限判断; 集成SpringBoot SpringBoot介绍 这个篇章主要是讲SpringSecurity的,Spring ...

  8. Spring security OAuth2.0认证授权学习第三天(认证流程)

    本来之前打算把第三天写基于Session认证授权的,但是后来视屏看完后感觉意义不大,而且内容简单,就不单独写成文章了; 简单说一下吧,就是通过Servlet的SessionApi 通过实现拦截器的前置 ...

  9. Spring security OAuth2.0认证授权学习第二天(基础概念-授权的数据模型)

    如何进行授权即如何对用户访问资源进行控制,首先需要学习授权相关的数据模型. 授权可简单理解为Who对What(which)进行How操作,包括如下: Who,即主体(Subject),主体一般是指用户 ...

  10. Spring security OAuth2.0认证授权学习第一天(基础概念-认证授权会话)

    这段时间没有学习,可能是因为最近工作比较忙,每天回来都晚上11点多了,但是还是要学习的,进过和我的领导确认,在当前公司的技术架构方面,将持续使用Spring security,暂不做Shiro的考虑, ...

随机推荐

  1. Unity高像素截图

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51386272 作者:car ...

  2. @Value取值为NULL的解决方案------https://blog.csdn.net/zzmlake/article/details/54946346

    @Value取值为NULL的解决方案 https://blog.csdn.net/zzmlake/article/details/54946346

  3. Codeforces Round #240 (Div. 2) C Mashmokh and Numbers

    , a2, ..., an such that his boss will score exactly k points. Also Mashmokh can't memorize too huge ...

  4. 洛谷 P3063 [USACO12DEC]牛奶的路由Milk Routing

    P3063 [USACO12DEC]牛奶的路由Milk Routing 题目背景 征求翻译.如果你能提供翻译或者题意简述,请直接发讨论,感谢你的贡献. 题目描述 Farmer John's farm ...

  5. 源码分析-react2-根节点渲染

    //FiberNode{ alternate : '通过该属性和后面的切片进行比较', child : '改切片的子切片', firstEffect : '当前要加入的切片', stateNode : ...

  6. scp: useful commands

    Examples Copy the file "foobar.txt" from a remote host to the local host $ scp your_userna ...

  7. TreeView获取目录下的所有文件

    /// <summary> /// TreeView获取目录下的所有文件 /// </summary> /// <param name="tree"& ...

  8. androidannotations的background和UiThread配合使用參考

    简单介绍 androidannotations在开发中的代码规范思考:(MVC思考)时间太紧,先贴代码: Activity的代码: package edu.njupt.zhb.main; import ...

  9. Unity3d代码从Android/IOS迁移到WindowsPhone经验笔记

    [1搭建坏境] 推荐:Windows 8.1 Enterprise + Visual studio 2013(完整安装) PS: 假设要Visual Studio 2012,先安装VS再安装WP8/W ...

  10. PHP第五课 自己主动类型转换与流程控制

    学习概要: 1.了解自己主动类型转换的有哪些 2.了解主要的流程控制语句 3.实例:实现日历表格的写法 自己主动类型转换 1)整型转字符串 echo $num."abc"; 2)字 ...