@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. importdata-- matlab

    source file: test.dat *************************** Day1  Day2  Day3  Day4  Day5  Day6  Day795.01 76.2 ...

  2. shell输出颜色、printf输出颜色

    1.echo开启彩色输出: -e 开启echo中的转义: \e或者\033来输出Esc颜色: 恢复默认颜色为:\e[0m; 命令格式: echo -e "\e[字背景颜色:文字颜色m字符串\ ...

  3. 51NOD欧姆诺姆和项链——KMP算法(非水题)

    >>点击进入原题测试<< 思路:好久不见,今天要开始真正写题了.这个题之前我的理解有点问题,导致写了很久最终都是一直都只能过样例.需要注意的是输出中每一个“1”都是和别的输出相 ...

  4. 1289大鱼吃小鱼(STL中栈的应用)

    >>点击进入测试<< 有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右.游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼.从左到右给出每条鱼的大小和游动的方向 ...

  5. JavaSE 学习笔记之包装类(十七)

    基本数据类型对象包装类:是按照面向对象思想将基本数据类型封装成了对象. 好处: 1:可以通过对象中的属性和行为操作基本数据. 2:可以实现基本数据类型和字符串之间的转换. 关键字   对应的类名 by ...

  6. Swift对象创建过程(PUT Object)——纠删码策略(二)

    相应Object使用纠删码(EC)作为存储策略时,BaseObjectController类中PUT和GET需要调用的一些方法会被ECObjectController中相应函数覆盖. 在GET Obj ...

  7. Sliding Window(滑动窗口)

    Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 58002   Accepted: 16616 Case Time Limi ...

  8. [bzoj1040][ZJOI2007]骑士(环套树DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1040 分析:第一感觉肯定是树形DP,但可惜不是树.仔细分析,这个图很特殊,每个联通块肯 ...

  9. 《Linux内核分析》MOOC课程

    http://www.cnblogs.com/wickedpriest/p/4315189.html

  10. PHP array_keys()

    定义和用法 array_keys() 函数返回包含数组中所有键名的一个新数组. 如果提供了第二个参数,则只返回键值为该值的键名. 如果 strict 参数指定为 true,则 PHP 会使用全等比较 ...