OAuth授权机制
OAuth协议旨在为用户资源提供一个安全开放的标准。目前支持OAuth 1.0a。
三歩走
1. 获取未授权的临时 token;(requestToken)
2. 用户登陆并授权你的应用;(authorize)
3. 获取 access_token。 (accessToken)
详细介绍请参考金山快盘开发文档:
http://www.kuaipan.cn/developers/document_oauth.htm
采用spring mvc
@Controller
@RequestMapping("kuaipanController")
public class KuaipanController {
org.apache.log4j.Logger log4j = org.apache.log4j.Logger.getLogger(LoginController.class);
@Autowired
private CloudInfoDao cloudInfoDao;
String oauth_consumer_key = "创建应用时的consumer_key";//第1步的 consumer_key
String oauth_signature_method = "HMAC-SHA1";//签名方法
String oauth_signature = "";//本次请求的签名
String consumer_secret = "创建应用时的consumer_secret";
String oauth_timestamp = "";
String oauth_version = "1.0";//版本
String oauth_nonce = "";//[ 0-9A-Za-z_ ]随机字符串,长度小于32字节。每次请求请使用不同的nonce
String oauth_request_method = "GET";
String requst_token_url = "https://openapi.kuaipan.cn/open/requestToken";
String accessToken_url = "https://openapi.kuaipan.cn/open/accessToken";
//必须外网能访问
String oauth_callback = "http://roboming.com/ming/kuaipanController/callback.do"; //回调函数,用户授权后返回的地址
@RequestMapping(value = "/OAuth.do", method = RequestMethod.GET)
public void oauth(HttpServletRequest request, HttpServletResponse response) throws
ServletException,IOException {
oauth_timestamp = set_timestamp();
oauth_nonce = set_nonce();
String set_basestring;
HttpSession session = request.getSession();
MemInfo mem = (MemInfo)session.getAttribute("memInfo");
try {
set_basestring = set_basestring();
oauth_signature = hmacsha1(set_basestring, consumer_secret+"&");
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(TestOAuth.class.getName()).log(Level.WARN, null, ex);
}
StringBuffer url = new StringBuffer("https://openapi.kuaipan.cn/open/requestToken?");
url.append("oauth_signature=" + oauth_signature + "&");
url.append("oauth_callback=" + oauth_callback + "&");
url.append("oauth_consumer_key=" + oauth_consumer_key + "&");
url.append("oauth_nonce=" + oauth_nonce + "&");
url.append("oauth_signature_method=" + oauth_signature_method + "&");
url.append("oauth_timestamp=" + oauth_timestamp + "&");
url.append("oauth_version=" + oauth_version +"");
//第一步(获取未授权的临时 token)
String message = retrieveHttpResponse(url.toString());
JSONObject obj = new JSONObject(message);
log4j.debug("第一步执行成功返回的json:"+obj);
log4j.debug("json:"+obj.get("oauth_token_secret"));
CloudInfo cloudInfo = new CloudInfo();
cloudInfo.setCloudsecret((String)obj.get("oauth_token_secret"));
cloudInfo.setToken((String)obj.get("oauth_token"));
cloudInfo.setMemInfo(mem);
cloudInfoDao.saveCloudInfo(cloudInfo);
//第二步(用户登陆并授权你的应用)
String url1 = "https://www.kuaipan.cn/api.php?ac=open&op=authorise&oauth_token="+obj.get("oauth_token");
response.sendRedirect(url1);
}
/**
* 金山快盘回调地址
* @param request
* @param response
* @param oauth_token 临时token
* @param oauth_verifier 验证码
* @return
* @throws IOException
*/
@RequestMapping(value = "/callback.do", method = RequestMethod.GET)
public String Callback(HttpServletRequest request, HttpServletResponse response,
@RequestParam String oauth_token, @RequestParam String oauth_verifier)
throws IOException {
oauth_timestamp = set_timestamp();
oauth_nonce = set_nonce();
CloudInfo cloud = cloudInfoDao.findCloudInByToken(oauth_token);
String signature;
try {
signature = set_signature(oauth_token);
oauth_signature = hmacsha1(signature, consumer_secret+"&"+cloud.getCloudsecret());
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
String url = "https://openapi.kuaipan.cn/open/accessToken?"
+ "&oauth_signature=" + oauth_signature
+ "&oauth_consumer_key=" + oauth_consumer_key
+ "&oauth_nonce=" + oauth_nonce
+ "&oauth_signature_method=" + oauth_signature_method
+ "&oauth_timestamp=" + oauth_timestamp
+ "&oauth_token=" + oauth_token
+ "&oauth_version=" + oauth_version;
//第三步(获取 access_token)
String message = retrieveHttpResponse(url);
JSONObject obj = new JSONObject(message);
log4j.debug("返回的json:"+obj);
cloud.setCloudkey(oauth_consumer_key);
cloud.setToken((String)obj.get("oauth_token"));
cloud.setType("金山快盘");
cloud.setMemInfo(cloud.getMemInfo());
cloudInfoDao.saveCloudInfo(cloud);
return "redirect:/memController/toMessage.do";
}
public String set_basestring() throws UnsupportedEncodingException {
String bss;
bss = oauth_request_method + "&" + URLEncoder.encode(requst_token_url, "utf-8") + "&";
oauth_callback = URLEncoder.encode(oauth_callback,"utf-8");
String bsss = "oauth_callback=" + oauth_callback
+ "&oauth_consumer_key=" + oauth_consumer_key
+ "&oauth_nonce=" + oauth_nonce
+ "&oauth_signature_method=" + oauth_signature_method
+ "&oauth_timestamp=" + oauth_timestamp
+ "&oauth_version=" + oauth_version;
bsss = URLEncoder.encode(bsss, "utf-8");
return bss + bsss;
}
public String set_signature(String oauth_token) throws UnsupportedEncodingException {
String bss;
bss = oauth_request_method + "&" + URLEncoder.encode(accessToken_url, "utf-8") + "&";
String bsss = "oauth_consumer_key=" + oauth_consumer_key
+ "&oauth_nonce=" + oauth_nonce
+ "&oauth_signature_method=" + oauth_signature_method
+ "&oauth_timestamp=" + oauth_timestamp
+ "&oauth_token=" + oauth_token
+ "&oauth_version=" + oauth_version;
bsss = URLEncoder.encode(bsss, "utf-8");
String bs = bss+ bsss;
return bs;
}
/**
* 本次请求的签名
* @param data
* @param key
* @return
*/
public String hmacsha1(String data, String key) {
byte[] byteHMAC = null;
try {
Mac mac = Mac.getInstance("HmacSHA1");
SecretKeySpec spec = new SecretKeySpec(key.getBytes(), "HmacSHA1");
mac.init(spec);
byteHMAC = mac.doFinal(data.getBytes());
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException ignore) {
}
String oauth = new BASE64Encoder().encode(byteHMAC);
String signatureEncode = "";
try {
signatureEncode = URLEncoder.encode(oauth, "utf-8");
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(KuaipanController.class.getName()).log(Level.WARN, null, ex);
}
oauth = signatureEncode;
return oauth;
}
/**
* [ 0-9A-Za-z_ ]随机字符串,长度小于32字节。每次请求请使用不同的nonce
* @return
*/
public String set_nonce() {
String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 32; i++) {
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
return sb.toString();
}
/**
* 时间戳,正整数,和标准时间不超过5分钟
* @return
*/
public String set_timestamp() {
Date date = new Date();
long time = date.getTime();
return (time + "").substring(0, 10);
}
public String retrieveHttpResponse(String url) throws IOException {
URL urlGet = new URL(url);
HttpURLConnection conn = (HttpURLConnection) urlGet.openConnection();
conn.setRequestMethod("GET"); // 必须是get方式请求
conn.setDoOutput(false);
conn.setDoInput(true);
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.connect();
InputStream is = conn.getInputStream();
int size = is.available();
byte[] jsonBytes = new byte[size];
is.read(jsonBytes);
conn.disconnect();
String message = new String(jsonBytes, "UTF-8");
return message;
}
}
分享到:
相关推荐
易语言金山快盘API模块源码是一套专为易语言设计的编程资源,它提供了与金山快盘(原名WPS网盘)进行交互的接口。金山快盘是一款云存储服务,用户可以在线存储、备份文件,并实现多设备间的同步。易语言作为中国本土...
《金山快盘API for Python深度解析》 金山快盘,作为一款云存储服务,为用户提供便捷的数据备份与共享功能。而“金山快盘API for Python”则是开发者利用Python语言与金山快盘服务进行交互的接口,它使得在Python...
2. **授权机制(Authentication)**:为了安全地访问用户数据,金山快盘的API可能包含了认证流程。这可能涉及OAuth协议,开发者需要获取用户的授权令牌以进行后续操作。 3. **文件和文件夹操作类(File and Folder ...
金山快盘Java API是针对金山快盘云存储服务的一套开发接口,允许开发者使用Java语言进行集成和开发,实现对金山快盘中的数据进行上传、下载、管理等操作。这个API提供了丰富的功能,使得开发者可以方便地在自己的...
在使用金山快盘 Java SDK时,开发者首先需要注册并获取API密钥,这是为了确保只有授权的应用才能访问快盘服务。然后,他们可以通过SDK初始化一个客户端对象,设置好密钥和其他必要的参数。接着,就可以利用这个...
金山快盘SDK是一款专为Windows操作系统设计的云存储开发工具包,它允许开发者集成到自己的应用程序中,实现数据的同步、备份和分享功能。这款SDK提供了详细的接口文档和示例代码,帮助开发者快速理解和使用快盘服务...
服务器端API则处理开发者服务器与金山快盘服务器之间的交互,如用户授权、获取文件列表等。 2. **Java库文件**:在"kuaipan-sdk-java-master"中,最主要的文件是Java库,这些库文件包含了与金山快盘服务交互所需的...
金山快盘是一款云存储服务,允许用户在互联网上存储、备份和共享文件,类似于 Dropbox 或者百度网盘。 易语言金山快盘API模块的核心功能在于调用API函数,这些函数是金山快盘服务提供的接口,用于执行各种操作,...
“目前正在开发中,后续逐步完善”意味着开发者需关注金山快盘开放平台的更新动态,及时升级SDK,以获取最新的功能和修复已知问题。 总结,金山快盘SDK为C++开发者提供了一条便捷的途径,将强大的云存储功能整合进...
【金山快盘1.2】是一款由金山软件公司开发的云存储服务,旨在为用户提供便捷、安全的数据存储和同步功能。这款产品允许用户在多台设备间无缝共享和访问个人文件,实现数据的云端备份,确保重要信息的安全。在1.2版本...
在Java中进行接口开发时,我们需要熟悉RESTful API的设计原则,这是金山文档中台提供的主要通信方式。REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于HTTP协议,使得客户端和...
这些API的具体用法需要参考金山词霸提供的开发文档或SDK,通常包括如何初始化、查询、释放资源等步骤。 在项目`GetWordApp`中,你可以找到一个简单的示例,展示如何在C#环境中启动这个过程。它可能包括以下步骤: 1...
- **权限与授权**: 使用这些API可能需要申请相应的开发权限和许可证,确保在合法范围内进行开发活动。 - **错误处理与调试**: 在开发过程中,需要编写良好的错误处理代码,以便在出现问题时能及时定位和修复。 - **...
【标签】"金山开源"表明这是金山软件公司的一个开放源代码项目。金山软件是中国知名的软件开发公司,其产品涉及安全、办公、游戏等多个领域。开源项目意味着源代码可供公众查看、使用和改进,鼓励社区协作和技术创新...
在Android开发过程中,为了优化用户体验,尤其是在网络条件不稳定或者数据流量有限的情况下,边播放边下载(也称为流式缓存)视频功能变得越来越重要。金山云Android平台HTTP缓存SDK就是为了满足这一需求而设计的。...
1. **权限管理**:确保有合法的授权来使用和分发基于WPS API开发的应用。 2. **版本兼容性**:关注WPS Office的版本更新,因为新的版本可能会引入新的API或废弃旧的API,需要及时更新代码。 3. **错误处理和异常捕获...
源代码中包含了金山卫士隐私保护器实现隐私保护功能的核心逻辑,这对于想要学习如何在软件开发中融入隐私保护机制的程序员来说,是一个不可多得的学习材料。 首先,通过分析源代码,我们可以深入理解金山卫士隐私...
【金山卫士源代码分析】 金山卫士,作为一款知名...通过对金山卫士源代码的深入学习,不仅可以提升C++编程技能,还能了解到安全软件的实现原理,对于想要从事安全领域开发的程序员来说,这是一个不可多得的学习资源。
WPS(Writer Processing System)是由金山软件开发的一款办公软件套件,包括文字处理、电子表格和演示文稿等组件,与Microsoft Office有很高的兼容性。WPS在线编辑和预览功能则让用户可以在云端处理文档,这涉及到...
"属于VC源码"表明这个项目是使用Microsoft Visual Studio 2008(简称VS2008)的C++环境开发的,因此涉及到的是C++编程语言和MFC(Microsoft Foundation Classes)库,MFC是微软提供的一套用于构建Windows应用程序的...