java实现 印象笔记AOuth 授权认证

java实现 印象笔记AOuth 授权认证


原创文章,转载请注明出处

前言:
由于我们公司最近考虑在我们的设备上接入第三方公有云(有道云笔记,印象笔记等),所以就让我调研市面上的公有云,可接入我们设备的可行性,由于有道云笔记的key的申请需要等待,所以我就先从印象笔记的入手了

话不多说,直接开始

第一:
首先我们需要去印象笔记官网申请 API Key,
申请成功后印象笔记会给我们两个参数:
Consumer Key: yuanlanglang
Consumer Secret: 58c76374a986a432

申请地址:https://dev.yinxiang.com/doc/articles/read_only_notes.php
java实现 印象笔记AOuth 授权认证
第二:
在我们的项目pom文件中添加javaSDK的依赖和授权所需的依赖

		<dependency>
		    <groupId>com.evernote</groupId>
		    <artifactId>evernote-api</artifactId>
		    <version>1.25.1</version>
		</dependency>
		<dependency>
		    <groupId>org.scribe</groupId>
		    <artifactId>scribe</artifactId>
		    <version>1.3.1</version>
    	</dependency>

第三:
编写工具类,代码如下

package com.ratta.supernotes.util;

import java.util.HashMap;
import java.util.Map;

import org.scribe.builder.ServiceBuilder;
import org.scribe.builder.api.EvernoteApi;
import org.scribe.model.Token;
import org.scribe.model.Verifier;
import org.scribe.oauth.OAuthService;

import com.evernote.auth.EvernoteAuth;
import com.evernote.auth.EvernoteService;

/** 
* @author yuanlanglang
*/
public class EverNoteOAuthUtil {

	static final String CONSUMER_KEY = "yuanlanglang";
	static final String CONSUMER_SECRET = "58c76374a986a432";
	static final EvernoteService EVERNOTE_SERVICE = EvernoteService.SANDBOX;
	static final String CALLBACK_URL = "https://supernote.com.cn/";
	
	public static OAuthService oAuthService() {
		String thisUrl = "https://supernote.com.cn/";
		//String thisUrl = request.getRequestURL().toString();
	    String cbUrl = thisUrl.substring(0, thisUrl.lastIndexOf('/') + 1) + CALLBACK_URL;
	        
	    Class<? extends EvernoteApi> providerClass = EvernoteApi.Sandbox.class;
	    if (EVERNOTE_SERVICE == EvernoteService.PRODUCTION) {
	      providerClass = org.scribe.builder.api.EvernoteApi.class;
	    }
		 OAuthService service = new ServiceBuilder()
			      .provider(providerClass)
			      .apiKey(CONSUMER_KEY)
			      .apiSecret(CONSUMER_SECRET)
			      .callback(cbUrl)
			      .build();
		 return service;
	  }
	
	/**
	 * 
	 * EverNote OAuth 授权第一步
	 * 
	 * 该方法获三个数据:
	 * 1、获取跳转授权页面的连接 authUrl
	 * 2、获取 authUrl 和第三步中所需要的 oauthToken
	 * 3、获取第三步中需要要的 oauthTokenSecret
	 * 
	 * @return requestMap
	 */
	public static Map<String, String> getRequestToken(){
		OAuthService service = oAuthService();
		Token requestToken = service.getRequestToken();
		String oauthToken = requestToken.getToken();
		String oauthTokenSecret = requestToken.getSecret();
		String authUrl = service.getAuthorizationUrl(requestToken);
		System.out.println(authUrl);
		Map<String, String> requestMap = new HashMap<String, String>();
		requestMap.put("oauthToken", oauthToken);
		requestMap.put("oauthTokenSecret", oauthTokenSecret);
		requestMap.put("authUrl", authUrl);
		return requestMap;
	}
	
	/**
	 * EverNote OAuth 授权第三步
	 * 
	 * 该方法获取连个数据
	 * 1、获取用户访问令牌 accessToken
	 * 2、获取 noteStoreUrl
	 * 
	 * @param oauthToken 第一步获取到的值
	 * @param oauthTokenSecret 第一步获取到的值
	 * @param oauthVerifier 第二步获取到的值
	 * (第二步是网页端的操作,网页端使用第一步返回的 authUrl 连接进行登录授权,授权成功后回调的浏览器地址栏里面会看到该参数)
	 * @return accessMap
	 */
	public static Map<String, String> getAccessToken (String oauthToken, 
			String oauthTokenSecret, String oauthVerifier){
		OAuthService service = oAuthService();
		Token scribeRequestToken = new Token(oauthToken, oauthTokenSecret);
        Verifier scribeVerifier = new Verifier(oauthVerifier);
        Token scribeAccessToken = service.getAccessToken(scribeRequestToken, scribeVerifier);
        System.out.println(scribeAccessToken.getRawResponse());
        EvernoteAuth evernoteAuth = EvernoteAuth.parseOAuthResponse(EVERNOTE_SERVICE, scribeAccessToken.getRawResponse());
        String accessToken = evernoteAuth.getToken();
        String noteStoreUrl = evernoteAuth.getNoteStoreUrl();
        Map<String, String> accessMap = new HashMap<String, String>();
        accessMap.put("accessToken", accessToken);
        accessMap.put("noteStoreUrl", noteStoreUrl);
		return accessMap;
	}
}

最后看一下一整个流程;
1、请求authUrl:
java实现 印象笔记AOuth 授权认证
运行上面的代码得到的结果是:
java实现 印象笔记AOuth 授权认证
保存requestTokenSecret和requestToken 第三步需要使用

得到的authUrl= https://sandbox.evernote.com/OAuth.action?oauth_token=yuanlanglang.169384C3F8D.687474703A2F2F6C6F63616C686F73742F687474703A2F2F6C6F63616C686F7374.89C3CFC6DF669C10895736938D34BF18

2、请求登录授权
我们把这个地址返回给浏览器客户端,客户端用这个地址就可以直接跳转到印象笔记的授权页面;
如图:
java实现 印象笔记AOuth 授权认证
登录成功后会跳转到询问页面
java实现 印象笔记AOuth 授权认证
确认授权后会跳转到我们的回调页面
java实现 印象笔记AOuth 授权认证
回调地址的设置在下图的地方
java实现 印象笔记AOuth 授权认证
我们需要的是回调地址栏后面的有效参数oauth verifier
https://supernote.com.cn/http://supernote.com.cn/?oauth_token=yuanlanglang.16938575B09.687474703A2F2F73757065726E6F74652E636F6D2E636E2F687474703A2F2F73757065726E6F74652E636F6D2E636E2F.1D783DCE998E5D625C5819FEBE8D5B6D&oauth_verifier=A05D541D1A673701CC2C8A70C2FCC6CE&sandbox_lnb=false#/home

3、获取用户访问令牌 accessToken
拿去到这个值以后,我们需要用它去获取用户访问令牌 accessToken
java实现 印象笔记AOuth 授权认证
运行这段代码得到以下数据:
java实现 印象笔记AOuth 授权认证

其中:accessToken = S=s1:U=952e4:E=1709013f58d:C=1693862c940:P=81:A=yuanlanglang:V=2:H=01d59843f8a3391c402676c7bbc080ed

4、获取印象笔记本列表
通过accessToken 获取笔记本列表,查看accessToken是否可用
java实现 印象笔记AOuth 授权认证
运行这段代码得到如下数据
java实现 印象笔记AOuth 授权认证
然后,我们看看印象笔记中我们是否就只有有这个笔记本
java实现 印象笔记AOuth 授权认证
如图所示;印象笔记中,我只有这么一个笔记本, 笔记本下面有两个笔记。

至此, java实现 印象笔记AOuth 授权认证过程就已经完成了。

参考资料:https://dev.yinxiang.com/doc/
https://github.com/evernote/evernote-sdk-java