@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. 突击战 (UVA 11729)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28436 思路:任务从开始时就不停执行,与其他任务毫无关联,当然是执 ...

  2. 百练4103:踩方格(DFS)

    描述 有一个方格矩阵,矩阵边界在无穷远处.我们做如下假设:a.    每走一步时,只能从当前方格移动一格,走到某个相邻的方格上:b.    走过的格子立即塌陷无法再走第二次:c.    只能向北.东. ...

  3. 天猫双11红包前端jQuery

    [01]   浏览器支持:IE10+和其他现代浏览器.   效果图:       步骤:   HTML部分:   <div class="opacity" style=&qu ...

  4. 使用 IAsyncResult 调用异步方法

    .NET Framework 和第三方类库中的类型可以提供允许应用程序在主应用程序线程之外的线程中执行异步操作的同时继续执行的方法.下面几部分介绍了在调用使用 IAsyncResult 设计模式的异步 ...

  5. java线程和线程池的使用

    java线程和线程池 一.创建多线程的方式 java多线程非经常见.怎样使用多线程,怎样创建线程.java中有两种方式,第一种是让自己的类实现Runnable接口.另外一种是让自己的类继承Thread ...

  6. Java读取数据库数据生成柱状图

    此案例是用swing显示数据的.须要引入jfreechart相关包.不同版本号可能包不同样.本人用的是 此案例在ssi框架下会报错,不用框架就没问题. Java后台逻辑代码: public class ...

  7. Android自己定义提示框

    在开发中,假设感觉系统自带的提示框不好看,开发人员能够自定义提示框的样式.主要是继承Dialog 程序文件夹结构 关键代码 package com.dzt.custom.dialog; import ...

  8. F广搜

    <span style="color:#330099;">/* F - 广搜 基础 Time Limit:1000MS Memory Limit:10000KB 64b ...

  9. 读写Word的组件DocX介绍与入门

    本文为转载内容: 文章原地址:http://www.cnblogs.com/asxinyu/archive/2013/02/22/2921861.html 开源Word读写组件DocX介绍与入门 阅读 ...

  10. HDU 1814 Peaceful Commission(2-sat 模板题输出最小字典序解决方式)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1814 Problem Description The Public Peace Commission ...