spring security oauths2 如何实现微信网页授权登录,目前实现了普通用户的用户名密码登录以及验证码登录,如何加入微信网页授权登录???、
看一下,是不是类似于开源中国这样的 支持微信登陆?https://www.oschina.net/home/login?goto_page=https%3A%2F%2Fwww.oschina.net%2F
去看下微信开放平台https://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN
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> 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 result = template.getForEntity(url, Object.class);
return result.getBody();
}
}