之前我介绍Android和IOS使用微信登陆的时候是通过直接使用客户端来获取相应的token和刷新token的,这样会比较危险,一来应用的秘钥Appsecret会暴露在客户端上,可能会被破解看到相应的秘钥,二来,token和refresh token也会直接落在本地.那么为了解决这个弊端,我们需要把这个获取token的方法放在服务器中,然后由服务器去请求这个token,这样私钥就不会保存在客户端上如果对我的文章感兴趣,欢迎订阅我的头条号:一点热,yeehot.com.,今天小编就来说说关于springboot项目怎么获取token?下面更多详细答案一起来看看吧!

springboot项目怎么获取token(应用实现微信登陆第三方登陆用springmvc获取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个步骤

  1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

  2. 通过code参数加上AppID和AppSecret等,然后我们可以通过springMVC使用http链接通过API换取access_token;

  3. 在自己的服务器中,通过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。欢迎大家收藏与转发,如果转载到其它网站,请与我联系.

,