之前我介绍Android和IOS使用微信登陆的时候是通过直接使用客户端来获取相应的token和刷新token的,这样会比较危险,一来应用的秘钥Appsecret会暴露在客户端上,可能会被破解看到相应的秘钥,二来,token和refresh token也会直接落在本地.那么为了解决这个弊端,我们需要把这个获取token的方法放在服务器中,然后由服务器去请求这个token,这样私钥就不会保存在客户端上如果对我的文章感兴趣,欢迎订阅我的头条号:一点热,yeehot.com.,今天小编就来说说关于springboot项目怎么获取token?下面更多详细答案一起来看看吧!
springboot项目怎么获取token
之前我介绍Android和IOS使用微信登陆的时候是通过直接使用客户端来获取相应的token和刷新token的,这样会比较危险,一来应用的秘钥Appsecret会暴露在客户端上,可能会被破解看到相应的秘钥,二来,token和refresh token也会直接落在本地.那么为了解决这个弊端,我们需要把这个获取token的方法放在服务器中,然后由服务器去请求这个token,这样私钥就不会保存在客户端上。如果对我的文章感兴趣,欢迎订阅我的头条号:一点热,yeehot.com.
快速链接:
android和ios使用微信登录
ios使用微信登录授权开发-实战二
我也简单介绍一下微信的关键的这几个要点:
1、Appsecret 是应用使用密钥,如果存在泄漏的话,需要立即更改,否则很可能遭到恶意攻击;
2、access_token 为用户授权第三方应用发起接口调用的凭证,这个有点像我们的钥匙,凭着钥匙可以开门;
3、refresh_token 为用户授权第三方应用的长效凭证,仅用于刷新access_token。
那么开始今天要说的内容
首先微信登陆分3个步骤
-
第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
-
通过code参数加上AppID和AppSecret等,然后我们可以通过springMVC使用http链接通过API换取access_token;
-
在自己的服务器中,通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。
一、客户端部分
我们只需要拿这个临时票据scope,然后递交到服务器中。
SendAuth.Resp sendResp = (SendAuth.Resp) resp;
我们把sendResp.code,通过http客户端访问我们的spring mvc 服务器
假设我们用Android的AsyncHttpClient:
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params=new RequestParams();
params.put("code",code);
client.get("http://www.yeehot.com/Yeehot-Program-King/user/access_token", params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
String result=new String(responseBody);
if (result!=null){
Toast.makeText(LoginActivity.this,result,Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(LoginActivity.this,"无法访问服务器",Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
}
});
二、服务器部分,使用spring mvc来实现
1、获取token的实现:
@ResponseBody
@RequestMapping(value = "/user/access_token", method = RequestMethod.GET)
public String token(String code){
Map<String, String> param = new HashMap<String, String>();
param.put("code",code);
param.put("secret", "请填写你的应用秘钥");
param.put("grant_type", "authorization_code");
param.put("appid","填写你的应用ID");
String https = "https://api.weixin.qq.com/sns/oauth2/access_token?" "appid=" param.get("appid") "&secret=" param.get("secret") "&code=" param.get("code") "&grant_type=authorization_code";
String infoString= httpget(https);
return infoString;
}
2、获取个人信息
这里需要注意的就是需要我们填写openid,这个openid就是我们在获取token的时候返回的。
public String getuserinfo(String access_token,String openid) {
Map<String, String> param = new HashMap<String, String>();
param.put("access_token", access_token);
param.put("openid", openid);
String https = "https://api.weixin.qq.com/sns/userinfo?" "access_token=" param.get("access_token") "&openid=" param.get("openid") ;
String infoString= httpget(https);
//System.out.println(infoString);
return infoString;
}
3、刷新token
public String refreshtoken(String refresh_token) {
Map<String, String> param = new HashMap<String, String>();
param.put("refresh_token", refresh_token);
param.put("grant_type", "refresh_token");
param.put("appid", "你的微信应用ID");
String https = "https://api.weixin.qq.com/sns/oauth2/refresh_token?" "refresh_token=" param.get("refresh_token") "&grant_type=" param.get("grant_type") "&appid=" param.get("appid") ;
String infoString= httpget(https);
System.out.println(infoString);
return infoString;
}
4、实现网络连接的方法
public String httpget(String url){
X509TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] xcs,
String string) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] xcs,
String string) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
SSLContext sslcontext;
try {
sslcontext = SSLContext.getInstance("TLS");
sslcontext.init(null, new TrustManager[]{tm}, null);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (KeyManagementException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ConnectionSocketFactory plainsf = PlainConnectionSocketFactory
.getSocketFactory();
LayeredConnectionSocketFactory sslsf = SSLConnectionSocketFactory
.getSocketFactory();
Registry<ConnectionSocketFactory> registry = RegistryBuilder
.<ConnectionSocketFactory> create().register("http", plainsf)
.register("https", sslsf).build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(
registry);
cm.setMaxTotal(200);
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
.build();
String result="";
HttpGet get = new HttpGet(url);
long start = System.currentTimeMillis();
try {
CloseableHttpResponse response = httpClient.execute(get);
try {
StringBuilder sb2 = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
String line;
while ((line = br.readLine()) != null) {
sb2.append(line);
}
result= sb2.toString();
} finally {
response.close();
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 关闭连接,释放资源
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
这里就讲解到这里了,如果在自己的项目中遇到问题可以提问,,欢迎继续关注我的头条号:一点热,yeehot.com。欢迎大家收藏与转发,如果转载到其它网站,请与我联系.
,