@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. PAT 1142 Maximal Clique

    A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the ...

  2. 洛谷P1028数的计算

    https://www.luogu.org/problemnew/show/P1028 只用递归会超时,需要用递归型动规,用一个数组保存已经算过的值,避免重复计算. 求数字为n的方案数的最优子结构为: ...

  3. sql sever 等待事件

    http://blog.csdn.net/dba_huangzj/article/details/7607844

  4. access-list/eigrp等 反掩码计算

    access-list/eigrp等 反掩码计算 原则:地址部分,相同的照写,不同的写"0"     反掩码部分,相同的写"0",不同的写"1&quo ...

  5. 如何快速查看EPS,AI等矢量文件

    使用Adobe Bridge可以快速查看所有这些格式的资源 查看EPS格式图片: 查看AI格式:   某些AI文件则无法预览(此外还有一些CDR的格式)   相比之下,ACDSee的效果则不如Adob ...

  6. 『干货』分享你最喜欢的技巧和提示(Xcode,objective-c,swift,c...等等)

    亲爱的读者们,你们好 !年底将近,分享从过去一年你最喜欢的技巧和建议作为礼物送给新手们.提交你的最喜欢的迅速或objc琐事,实用的提示,意外的发现,实用的解决方法,没用的迷恋,或不论什么其它你认为今年 ...

  7. MapReduce02

    ====================== MapReduce实现 ====================== Input: 一系列key/value对 用户提供两个函数实现: map(k,v) ...

  8. 51nod 1611 金牌赛事

    被亮亮D飞啦!!QWQ 这题明明是最大权闭合子图+线段树优化构图好不好 被迫考虑DP,并且考虑f[i]表示到第i个位置的最大值(第i个位置可选可不选) 对于最终的答案,我们可以分割成一段一段的,也就是 ...

  9. innerxml and outerxml

    xml文件如下 <root> <a></a> <b></b> <c></c> <a></a> ...

  10. What is a good buffer size for socket programming?

    http://stackoverflow.com/questions/2811006/what-is-a-good-buffer-size-for-socket-programming 问题: We ...