`
zhanggeng22
  • 浏览: 4385 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

金山快盘授权API开发

阅读更多
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模块源码

    易语言金山快盘API模块源码是一套专为易语言设计的编程资源,它提供了与金山快盘(原名WPS网盘)进行交互的接口。金山快盘是一款云存储服务,用户可以在线存储、备份文件,并实现多设备间的同步。易语言作为中国本土...

    金山快盘API_for_python

    《金山快盘API for Python深度解析》 金山快盘,作为一款云存储服务,为用户提供便捷的数据备份与共享功能。而“金山快盘API for Python”则是开发者利用Python语言与金山快盘服务进行交互的接口,它使得在Python...

    金山快盘 java api源码

    2. **授权机制(Authentication)**:为了安全地访问用户数据,金山快盘的API可能包含了认证流程。这可能涉及OAuth协议,开发者需要获取用户的授权令牌以进行后续操作。 3. **文件和文件夹操作类(File and Folder ...

    金山快盘java api

    金山快盘Java API是针对金山快盘云存储服务的一套开发接口,允许开发者使用Java语言进行集成和开发,实现对金山快盘中的数据进行上传、下载、管理等操作。这个API提供了丰富的功能,使得开发者可以方便地在自己的...

    金山快盘 Java SDK

    在使用金山快盘 Java SDK时,开发者首先需要注册并获取API密钥,这是为了确保只有授权的应用才能访问快盘服务。然后,他们可以通过SDK初始化一个客户端对象,设置好密钥和其他必要的参数。接着,就可以利用这个...

    金山快盘SDK

    金山快盘SDK是一款专为Windows操作系统设计的云存储开发工具包,它允许开发者集成到自己的应用程序中,实现数据的同步、备份和分享功能。这款SDK提供了详细的接口文档和示例代码,帮助开发者快速理解和使用快盘服务...

    金山快盘JAVA版SDK.zip

    服务器端API则处理开发者服务器与金山快盘服务器之间的交互,如用户授权、获取文件列表等。 2. **Java库文件**:在"kuaipan-sdk-java-master"中,最主要的文件是Java库,这些库文件包含了与金山快盘服务交互所需的...

    易语言-易语言金山快盘API模块

    金山快盘是一款云存储服务,允许用户在互联网上存储、备份和共享文件,类似于 Dropbox 或者百度网盘。 易语言金山快盘API模块的核心功能在于调用API函数,这些函数是金山快盘服务提供的接口,用于执行各种操作,...

    金山快盘 SDK

    “目前正在开发中,后续逐步完善”意味着开发者需关注金山快盘开放平台的更新动态,及时升级SDK,以获取最新的功能和修复已知问题。 总结,金山快盘SDK为C++开发者提供了一条便捷的途径,将强大的云存储功能整合进...

    金山快盘1.2

    【金山快盘1.2】是一款由金山软件公司开发的云存储服务,旨在为用户提供便捷、安全的数据存储和同步功能。这款产品允许用户在多台设备间无缝共享和访问个人文件,实现数据的云端备份,确保重要信息的安全。在1.2版本...

    金山文档中台对接v6 java

    在Java中进行接口开发时,我们需要熟悉RESTful API的设计原则,这是金山文档中台提供的主要通信方式。REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于HTTP协议,使得客户端和...

    C# 源码利用金山词霸 取词 自带XdictGrb.dll

    这些API的具体用法需要参考金山词霸提供的开发文档或SDK,通常包括如何初始化、查询、释放资源等步骤。 在项目`GetWordApp`中,你可以找到一个简单的示例,展示如何在C#环境中启动这个过程。它可能包括以下步骤: 1...

    WPS 二次开发文档 etapi wppapi wpsapi

    - **权限与授权**: 使用这些API可能需要申请相应的开发权限和许可证,确保在合法范围内进行开发活动。 - **错误处理与调试**: 在开发过程中,需要编写良好的错误处理代码,以便在出现问题时能及时定位和修复。 - **...

    金山开源BKUI.16.Tinyxml

    【标签】"金山开源"表明这是金山软件公司的一个开放源代码项目。金山软件是中国知名的软件开发公司,其产品涉及安全、办公、游戏等多个领域。开源项目意味着源代码可供公众查看、使用和改进,鼓励社区协作和技术创新...

    Android-金山云android平台http缓存SDK可方便地与播放器集成实现http点播视频边播放边下载缓存功能

    在Android开发过程中,为了优化用户体验,尤其是在网络条件不稳定或者数据流量有限的情况下,边播放边下载(也称为流式缓存)视频功能变得越来越重要。金山云Android平台HTTP缓存SDK就是为了满足这一需求而设计的。...

    WPS二次开发接口.rar

    1. **权限管理**:确保有合法的授权来使用和分发基于WPS API开发的应用。 2. **版本兼容性**:关注WPS Office的版本更新,因为新的版本可能会引入新的API或废弃旧的API,需要及时更新代码。 3. **错误处理和异常捕获...

    金山卫士隐私保护器 源代码

    源代码中包含了金山卫士隐私保护器实现隐私保护功能的核心逻辑,这对于想要学习如何在软件开发中融入隐私保护机制的程序员来说,是一个不可多得的学习材料。 首先,通过分析源代码,我们可以深入理解金山卫士隐私...

    金山卫士源代码(漏洞扫描。隐私保护)

    【金山卫士源代码分析】 金山卫士,作为一款知名...通过对金山卫士源代码的深入学习,不仅可以提升C++编程技能,还能了解到安全软件的实现原理,对于想要从事安全领域开发的程序员来说,这是一个不可多得的学习资源。

    基于wps在线编辑、在线预览后台服务

    WPS(Writer Processing System)是由金山软件开发的一款办公软件套件,包括文字处理、电子表格和演示文稿等组件,与Microsoft Office有很高的兼容性。WPS在线编辑和预览功能则让用户可以在云端处理文档,这涉及到...

    仿金山词霸界面修正版[VS2008编译通过]

    "属于VC源码"表明这个项目是使用Microsoft Visual Studio 2008(简称VS2008)的C++环境开发的,因此涉及到的是C++编程语言和MFC(Microsoft Foundation Classes)库,MFC是微软提供的一套用于构建Windows应用程序的...

Global site tag (gtag.js) - Google Analytics