最近项目中有需要调用Giee API的需求,于是便了解研究了一下.
1. OAuth2.0认证与授权
OAuth是一种开放授权协议。就像很多应用可以使用qq微信登陆一样,你并没有吧你的密码告诉第三方应用,也不可能告诉,但是当你用微信登陆第三方应用是,第三方应用会获取一些你的基本信息,这些信息肯定是腾讯做的接口,你同意后第三方应用就可以调用这个接口去获取你的数据,如果需要额外获取其他数据,你会发现有提示信息,”是否同意XXX获取你的头像。。。“,如果你同意,第三方应用便可以获取到了,说的比较通俗,个人理解大致就是这么回事。而Oauth就是让这个授权的过程更加安全的规范。
OAuth认证和授权的过程如下:
1、用户访问第三方网站网站,想对用户存放在服务商的某些资源进行操作。
2、第三方网站向服务商请求一个临时令牌。
3、服务商验证第三方网站的身份后,授予一个临时令牌。
4、第三方网站获得临时令牌后,将用户导向至服务商的授权页面请求用户授权,然后这个过程中将临时令牌和第三方网站的返回地址发送给服务商。
5、用户在服务商的授权页面上输入自己的用户名和密码,授权第三方网站访问所相应的资源。
6、授权成功后,服务商将用户导向第三方网站的返回地址。
7、第三方网站根据临时令牌从服务商那里获取访问令牌。
8、服务商根据令牌和用户的授权情况授予第三方网站访问令牌。
9、第三方网站使用获取到的访问令牌访问存放在服务商的对应的用户资源
调用Gitee的api,首先需要通过其OAuth的认证,认证成功后Gitee服务器会返回给你一个访问令牌(access_token),然后你就可以拿着这个token去调用Gitee的API获取用户的数据。具体流程如下:
0.首先需要用户同意第三方获取其数据,对应的操作是:
登陆Gitee账号,进入设置页面——》创建第三方应用(这个应用就是你需要获取用户Gitee数据的应用)——》页面有很多信息需要填写,最重要的是应用回调地址,就是你系统中的某个接口去接受用户授权后码云认证服务器返回给你的访问令牌(access__token),其次就是权限,用户开放给你可以访问的权限。——》创建成功后,会生成client id和client secret。
1.授权
系统获取用户的client_id和client_secret,访问https://gitee.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code,请求结果是一个授权的页面
redirect_uri是你系统接收返回值的接口地址。
我在controller层定义的接口
访问这个地址会调到认证页面,用户勾选权限,然后授权,你的接口会接受一个code的参数
直接在页面用javascrip打开这个页面就欧克,window.open(url);
2.获取授权码
向码云认证服务器发送POST请求:https://gitee.com/oauth/token?grant_type=authorization_code&code={code}&client_id={client_id}&redirect_uri={redirect_uri}&client_secret={client_secret},请求结果是一个包含授权码access_token和权限名称的json数据
我是在后台用HttpClient发送请求,获取数据(使用到的第三方架包:)
Gitee是我自定义的类
public Gitee doPost() {
Gitee gitee=null;HttpPost httpPost=new HttpPost(url);
CloseableHttpClient client=HttpClients.createDefault();
String respContent=null;
JSONObject jsonObject=new JSONObject();
jsonObject.put("grant_type", grant_type);
jsonObject.put("code", code);
jsonObject.put("client_id", client_id);
jsonObject.put("redirect_uri", redirect_uri);
jsonObject.put("client_secret", client_secret);
StringEntity entity=new StringEntity(jsonObject.toString(), "utf-8");
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
//设置User-Agent,否则请求码403
httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
httpPost.setEntity(entity);
System.out.println("into_______GiteeOauth");
HttpResponse httpResponse = null;
try {
httpResponse = client.execute(httpPost);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int resultCode=httpResponse.getStatusLine().getStatusCode();
System.out.println("resultCode:"+resultCode);
if(resultCode==200) {
HttpEntity entity2=httpResponse.getEntity();
try {
gitee=JSON.parseObject(EntityUtils.toString(entity2, "utf-8"),Gitee.class);
System.out.println("gitee:"+gitee.toString());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
client.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return gitee;
}
3.调用api
获取到access_token就可以去调用api获取数据了,需要需注意的access_token有效期是一天。
如果是Java开发的话,可以使用HttpClient,在后台请求数据HttpClient示例