新浪微博OAuth授权的Java实现

合集下载

一步步搭建最简单oauth2.0认证和授权

一步步搭建最简单oauth2.0认证和授权

⼀步步搭建最简单oauth2.0认证和授权oauth2.0 最早接触这个概念是在做微信订阅号开发。

当时还被深深的绕进去,关于oauth2.0的解释⽹上有好多,⽽且都讲解的⽐较详细,下⾯给⼤家价格参考资料。

接下来⽤最简短的代码实现author认证和授权。

我们也可以先实现简单案例,在理解。

这⾥我以客户端模式为例。

MVC 4 Web API 项⽬或者MVC52. 添加引⽤Owin.dllMicrosoft.Owin.dllMicrosoft.Owin.Host.SystemWeb.dllMicrosoft.Owin.Security.dllMicrosoft.Owin.Security.Oauth.dllMicrosoft.Owin.Security.Cookies.dllMicrosoftAspNet.Identity.Owin.dll3.修改 App_Start ⽂件夹下⾯ Startup.Auth.cs⽂件,把原来⾃动⽣成那些东西全部去掉。

public void ConfigureAuth(Owin.IAppBuilder app){var OauthOptions = new Microsoft.Owin.Securtity.Oauth.OAuthAuthorizationServerOptions{AllowInsecureHttp = true,AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,//获取 access_token 授权服务请求地址TokenEndpointPath = new Microsoft.Owin.PathString("/token"),//获取 authorization_code 授权服务请求地址AuthorizeEndpointPath = new Microsoft.Owin.PathString("/authorize"),//access_token 过期时间AccessTokenExpireTimeSpan = TimeSpan.FromSeconds(990),//access_token 相关授权服务Provider = new OpenAuthorizationServerProvider(),//authorization_code 授权服务RefreshTokenProvider = new OpenRefreshTokenProvider() //refresh_token 授权服务};eOAuthBearerTokens(OAuthOptions);}修改Startup.cs ⽂件[assembly: OwinStartup(typeof(WebApplication2.Startup))]public partial class Startup{public void Configuration(IAppBuilder app){ConfigureAuth(app);var configuration = new HttpConfiguration();WebApiConfig.Register(configuration);eWebApi(configuration);}}上⾯这个⽂件的作⽤相当于 Global.asax⽂件,在程序启动是及执⾏。

新浪微博API接口(JAVA版)

新浪微博API接口(JAVA版)

新浪微博API(java版)============================修改事项:1、接口返回结果采用json对象方式封装2、修改WeiboResponse中空字符串("")调用判断的bug3、修改了JSONObject中返回空对象的问题4、增加了直接文件上传接口直接常用接口实例:(使用前先修改 Weibo.java 中public static final String CONSUMER_KEY = "";public static final String CONSUMER_SECRET = "";填写成实际申请的 CONSUMER_KEY 及 CONSUMER_SECRET)1、获取最新公共微博列表参考:weibo4j.examples.GetTimelines 中的getPublicTimeline()部分2、发表微博参考:weibo4j.examples.Update 中的updateStatus(...)部分3、发表评论参考:weibo4j.examples.Update 中的updateComment(...)部分4、删除评论参考:weibo4j.examples.Update 中的destroyComment(...)部分5、发送私人消息参考:weibo4j.examples.DirectMessage 类6、发表带图片的微博参考:weibo4j.examples.OAuthUploadByFile 中的uploadStatus(status,file)部分7、更新用户头像参考:weibo4j.examples.OAuthUpdateProfile类8、OAuth桌面应用访问步骤: 1> 在weibo4j.examples.OAuthUpdate 访问认证的URL,得到pin2> 在weibo4j.examples.OAuthUpdate 输入pin,然后得到AccessToken3> 即可访问用户的微博,参考:weibo4j.examples.OAuthUpdateTwo9、OAuth WEB应用访问步骤:1> 在weibo4j.examples.WebOAuth 带backurl参数请求OAuth认证,获得RequestToken2> 在callback 的地址里面,接受到oauth_verifier参数,然后再发一次请求,即可获得AccessToken3> 用AccessToken访问用户的微博实例说明:在web目录下面有两个jsp页面:call.jsp是发送request的请求,在第九行的参数“http://localhost:8080/callback.jsp”是回调地址当获取成功后将RequestToken置入session,并重定向到用户认证地址callback.jsp接收到oauth_verifier参数,从session里面拿到RequestToken,再请求获取AccessToken获取到后即可对用户微博进行操作,本例中是发表微博测试环境:本例中可以将call.jsp和 callback.jsp直接放到tomcat的根目录下面:webapps\ROOT 并将实例项目编译好的classes文件和lib目录拷贝到ROOT\WEB-INF下面重启tomcat,访问http://localhost:8080/call.jsp?opt=1注:也可以打成war包,但注意call.jsp里面的callback参数需要做相应修改============================================================================= 其他接口在weibo4j.Weibo类中定义,调用方式请参考weibo4j.examples,下面是完整的接口列表:获取下行数据集(timeline)接口方法名:statuses/public_timeline 最新公共微博方法名:getPublicTimelinestatuses/friends_timeline 最新关注人微博 (别名: statuses/home_timeline) 方法名:getFriendsTimelinestatuses/user_timeline 用户发表微博列表方法名:getUserTimeline(String id, Paging paging)statuses/mentions 最新 @用户的方法名: getMentions()statuses/comments 单条评论列表(按微博) 方法名:getComments()微博访问接口statuses/show 获取单条方法名:showStatus(long id)statuses/update 发表微博方法名:updateStatus(String status)statuses/upload 发表微博及图片方法名:uploadStatus(String status,File file) statuses/destroy 删除方法名: destroyStatus(long statusId)statuses/comment 评论方法名: destroyComment(long commentId)statuses/comment_destroy 删除评论方法名:destroyComment私信接口direct_messages 我的私信列表方法名:getDirectMessages() 分页getDirectMessages(Paging paging)direct_messages/sent 我发送的私信列表方法名:getSentDirectMessages()direct_messages/new 发送私信方法名:sendDirectMessage(String id,String text) direct_messages/destroy 删除一条私信方法名:destroyDirectMessage(int id)关注接口friendships/create 关注某用户方法名:createFriendship(String id)或createFriendship(String id, boolean follow)friendships/destroy 取消关注方法名: destroyFriendship(String id)friendships/exists 是否关注某用户方法名:existsFriendship(String userA, String userB)friends/ids 关注列表方法名: getFriendsIDs(long cursor)followers/ids 粉丝列表方法名:getFollowersIDs(long cursor)账号接口account/verify_credentials 验证身份是否合法方法名:verifyCredentials()account/rate_limit_status 查看当前频率限制方法名:rateLimitStatus()account/update_profile_image 更改头像方法名:updateProfileImage(File image) account/update_profile 更改资料方法名:User updateProfile(String name, String email, String url, String location, String description)收藏接口favorites 收藏列表方法名:getFavorites()favorites/create 添加收藏方法名:createFavorite(long id)favorites/destroy 删除收藏方法名:destroyFavorite(long id)。

Sina微博Java版

Sina微博Java版

新浪微博---开放平台的使用01现在有很多的开放平台,可以供第三方来基于这些开放平台开发应用程序,最近在做新浪微博的一个小例子,刚刚入门,高手勿拍砖!1、这个是新浪的开放平台,里面有SDK,有开发文档等等2、下载SDK,我暂时先下载了一个JAVA的SDK来实验一下,具体地址:/wiki/index.php/SDK#Java_SDK3、将其解压到eclipse的workspace里面,然后导入到eclipse4、开发第三方应用程序,需要创建一下应用,之后你会得到一个KeyApp Key:1211******App Secret:d6b*****************************5、一开始是找到的是weibo4j.Weibo.java、weibo4j.examples.statues.UpdateStatus.java文件,于是在UpdateStatus.java里修改了一下Key和Secret的值,当然如果用默认的,好像是不出错的,但是我用了一下自己的,却出错了,什么错误呢?Java代码1weibo4j.WeiboException: 403:The request is understood, but it has been refused. An accompanying error message will explain why.2{"request":"/statuses/update.json","error_code":"403","error":"40320:Error: basic auth forbidden !"}34at weibo4j.http.HttpClient.httpRequest(HttpClient.java:669)5at weibo4j.http.HttpClient.httpRequest(HttpClient.java:611)6at weibo4j.http.HttpClient.post(HttpClient.java:435)7at weibo4j.Weibo.updateStatus(Weibo.java:1276)8at weibo4j.examples.statuses.UpdateStatus.main(UpdateStatus.java:28)网上说的是:将自己添加为测试用户①登录开放平台,我的应用--编辑应用属性---测试用户UID②这个UID就是你注册新浪微博的时候,分配给你的一串类似于QQ号的东西,可以到“我的微博”,上面会有你的名字和微博的ID,这串数字就是UID③将UID放到输入框里,就会将你自己添加为测试用户看到basic auth认证机制不能用了,于是我将Weibo weibo = getWeibo(false,args);里面的false改为true,让它使用OAuth认证,但是可能是由于我太菜了,运行后还是有问题,再次如果有那个朋友知道的话帮个忙哈Java代码9args = new String[]{"xxxxx@","*******"};10Weibo weibo = getWeibo(false,args);1112Status status = weibo.updateStatus("心语互动测试成功!");13System.out.println(status.getId() + " : "+ status.getText()+" "+status.getCreatedAt());上面是UpdateStatus里面的代码,下面是运行后的错误Java代码14weibo4j.WeiboException: 403:The request is understood, but it has been refused. An accompanying errormessage will explain why.15{"request":"/statuses/update.json","error_code":"403","error":"40320:Error: basic auth forbidden !"}1617at weibo4j.http.HttpClient.httpRequest(HttpClient.java:669)18at weibo4j.http.HttpClient.httpRequest(HttpClient.java:611)19at weibo4j.http.HttpClient.post(HttpClient.java:435)20at weibo4j.Weibo.updateStatus(Weibo.java:1276)21at weibo4j.examples.statuses.UpdateStatus.main(UpdateStatus.java:28)即使查了错误代码,还是不知道到底是哪里错了6、后来我看了一下readme.txt说明文档,想用不需要认证的OAuth来试试,于是按照它的说法:OAuth桌面应用访问步骤:1> 在weibo4j.examples.OAuthUpdate 访问认证的URL,得到pin2> 在weibo4j.examples.OAuthUpdate 输入pin,然后得到AccessToken3> 即可访问用户的微博,参考:weibo4j.examples.OAuthUpdateTwoweibo4j.examples.OAuthUpdateTwo尝试了一下,运行后控制台下会有个链接,点击这个链接,会得到一个pin:350576在控制台输入pin后,得到了Access token: f520d1efb5532e6daf**************Access token secret: ddb5f6990b66579fe4**************7、然后将Access token和Access token secret放入weibo4j.examples.OAuthUpdateTwo中Java代码22/*23* 此处需要填写AccessToken的key和Secret,可以从OAuthUpdate的执行结果中拷贝过来24*/25// weibo.setToken("AccessToken", "AccessTokenSecret");26weibo.setToken("f520d1efb5532e6daf**************", "ddb5f6990b66579fe4**************"); 8、下面这条语句是更新状态的语句,你可以输入你想说的Java代码27Status status = weibo.updateStatus("你好吗?");9、然后还要将你的用户名和密码加入到里面,注意红色部分Java代码28<STRONG><SPAN style="COLOR: #ff0000">args = new String[]{"*******@","*******"};</SPAN></STRONG>29if (args.length < 2) {30System.out.println(31"Usage: java weibo4j.examples.OAuthUpdateTwo token tokenSecret");32System.exit( -1);33}10、运行JAVA程序,然后更新博客,你会看到状态更新了使用Oauth向新浪微博发消息最近看了一下新浪围脖的Oauth消息发送的方式,整理一下。

java实现微博后台登录发送微博

java实现微博后台登录发送微博

java实现微博后台登录发送微博⾸先你需要有个微博开发者账号,我们需要的是App Key和App Secre及redirect_URI,公司原本就有所以这⼀步省下来了,百度搜下有很多。

好了现在开始:⾸先我在⽹上找到了这个代码,本来挺⾼兴的⼀次性解决了嘛;可是报错 “token刷新失败”,看了下代码返回的是 200 不是302 ,额有点懵了,不管了先研究研究为什么会这样吧,我将他⽣成的⽹址放到浏览器上看了下,进⼊的是授权页⾯,不会需要先登录。

F12 看了下确实也是 200 ,于是我估计是不是因为没有登录成功的原因,于是开始做微博的后台登录找到这样⼀篇代码,原地址已经忘了,原作者不好意思啊。

package com.spider.httpclient;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import .URI;import .URISyntaxException;import .URLEncoder;import java.util.ArrayList;import java.util.Date;import java.util.List;import javax.script.Invocable;import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;import javax.script.ScriptException;import mons.codec.binary.Base64;import org.apache.http.Header;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import ValuePair;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.config.CookieSpecs;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.config.Registry;import org.apache.http.config.RegistryBuilder;import org.apache.http.cookie.CookieSpec;import org.apache.http.cookie.CookieSpecProvider;import org.apache.http.impl.client.BasicCookieStore;import org.apache.http.impl.client.HttpClients;import org.apache.http.impl.cookie.DefaultCookieSpec;import org.apache.http.impl.cookie.DefaultCookieSpecProvider;import org.apache.http.message.BasicNameValuePair;import org.apache.http.protocol.HttpContext;import org.apache.http.util.EntityUtils;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;/*** 新浪微博登录器,2016年4⽉7⽇08:30:16,密码加密⽅式采⽤RSA2,加密⽅式js内** @author tom**/public class SinaWeiboLogger {private HttpClient client;private HttpPost post;private HttpGet get;private BasicCookieStore cookieStore;private String username; // 明⽂账号private String password; // 明⽂密码private String su; // base64加密后账号private String sp; // RSA加密后密码// 预登陆信息所需数据开始private long servertime; // 服务器时间戳private String nonce; // 服务器返回字符串private String rsakv; // 服务器返回字符串,rsa加密密码⽤private String pubkey; // 服务器返回rsa加密公⽤密钥,⽤于rsa加密private int retcode; //状态值private String pcid;private int is_openlock;private int showpin;private int exectime;// 预登陆信息结束//登录后返回json数据private String uid;private String nick;private JSONArray domainurls;//private StringBuffer headerCookie = new StringBuffer();//登录密码加密js⽂件内容private static String sina_js = "var sinaSSOEncoder=sinaSSOEncoder||{};(function(){var hexcase=0;var chrsz=8;this.hex_sha1=function(s){return binb2hex(core_sha1(str2binb(s),s.length*chrsz));};var core_sha1=function(x,len){x[len>>5]|=0x80<<(24-len%32);x[ public SinaWeiboLogger(String username, String password) {ername = username;this.password = password;//cookie策略,不设置会拒绝cookie rejected,设置策略保存cookie信息cookieStore = new BasicCookieStore();CookieSpecProvider myCookie = new CookieSpecProvider() {public CookieSpec create(HttpContext context) {return new DefaultCookieSpec();}};Registry<CookieSpecProvider> rg = RegistryBuilder.<CookieSpecProvider> create().register("myCookie", myCookie).build();client = HttpClients.custom().setDefaultCookieStore(cookieStore).setDefaultCookieSpecRegistry(rg).build();get = new HttpGet();post = new HttpPost();}/*** 预登陆,使⽤⽤户名base64加密后get请求,得到返回值,使⽤返回值加密⽤户密码再次请求** @throws IOException* @throws ClientProtocolException* @throws URISyntaxException*/private void preLogin() throws ClientProtocolException, IOException, URISyntaxException {// 1su = new String(Base64.encodeBase64(URLEncoder.encode(ername, "UTF-8").getBytes()));String preLoginUrl = "/sso/prelogin.php?entry=account&callback=sinaSSOController.preloginCallBack&su="+ su + "&rsakt=mod&client=ssologin.js(v1.4.15)&_=" + new Date().getTime();get.setURI(new URI(preLoginUrl));get.addHeader("Host", "");get.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0");get.addHeader("Accept", "*/*");get.addHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");get.addHeader("Accept-Encoding", "gzip, deflate");get.addHeader("Referer", "/");get.addHeader("Connection", "keep-alive");HttpResponse resp = client.execute(get);//保存请求返回cookie,登录后请求其他页⾯需要带cookiesaveCookie(resp.getAllHeaders(), this.headerCookie);HttpEntity entity = resp.getEntity();String cont = EntityUtils.toString(entity);// System.out.println(cont);cont = cont.replace("sinaSSOController.preloginCallBack(", "");cont = cont.replace(")", "");JSONObject json = JSONObject.parseObject(cont);this.retcode = json.getIntValue("retcode");this.servertime = json.getLongValue("servertime");this.pcid = json.getString("pcid");this.nonce = json.getString("nonce");this.pubkey = json.getString("pubkey");this.rsakv = json.getString("rsakv");this.is_openlock = json.getIntValue("is_openlock");this.showpin = json.getIntValue("showpin");this.exectime = json.getIntValue("exectime");}private void saveCookie(Header[] headers, StringBuffer headerCookie) {for(Header h : headers) {if (h.getName().equals("Set-Cookie")) {headerCookie.append(h.getValue()).append(";");}}}/*** 登录新浪通⾏证账号登录,加密密码,post请求** @return** @throws IOException* @throws ClientProtocolException* @throws ScriptException* @throws NoSuchMethodException* @throws URISyntaxException*/private void accountLogin() throws NoSuchMethodException, ScriptException, ClientProtocolException, IOException, URISyntaxException { // 2String loginUrl = "/sso/login.php?client=ssologin.js(v1.4.15)&_="+ new Date().getTime();post.setURI(new URI(loginUrl));post.addHeader("Host", "");post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0");post.addHeader("Accept", "*/*");post.addHeader("Content-Type", "application/x-www-form-urlencoded");post.addHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");post.addHeader("Accept-Encoding", "gzip, deflate");post.addHeader("Referer", "/");post.addHeader("Connection", "keep-alive");// 使⽤js加密密码,RSA,调⽤js内⽅法ScriptEngineManager sem = new ScriptEngineManager();ScriptEngine se = sem.getEngineByName("javascript");se.eval(sina_js);if (se instanceof Invocable) {Invocable iv = (Invocable) se;sp = (String) iv.invokeFunction("getpass", this.password, this.servertime, this.nonce,this.pubkey);}List<NameValuePair> parms = new ArrayList<NameValuePair>();parms.add(new BasicNameValuePair("entry", "account"));parms.add(new BasicNameValuePair("gateway", "1"));parms.add(new BasicNameValuePair("from", ""));parms.add(new BasicNameValuePair("savestate", "0"));parms.add(new BasicNameValuePair("useticket", "0"));parms.add(new BasicNameValuePair("pagerefer", ""));parms.add(new BasicNameValuePair("vsnf", "1"));parms.add(new BasicNameValuePair("su", su));parms.add(new BasicNameValuePair("service", "sso"));parms.add(new BasicNameValuePair("servertime", servertime + ""));parms.add(new BasicNameValuePair("nonce", nonce));parms.add(new BasicNameValuePair("pwencode", "rsa2"));parms.add(new BasicNameValuePair("rsakv", rsakv));parms.add(new BasicNameValuePair("sp", sp));parms.add(new BasicNameValuePair("sr", "1366*768"));parms.add(new BasicNameValuePair("encoding", "UTF-8"));parms.add(new BasicNameValuePair("cdult", "3"));parms.add(new BasicNameValuePair("domain", ""));parms.add(new BasicNameValuePair("prelt", "51"));parms.add(new BasicNameValuePair("returntype", "TEXT"));post.setEntity(new UrlEncodedFormEntity(parms));HttpResponse resp = client.execute(post);//保存请求返回cookie,登录后请求其他页⾯需要带cookiesaveCookie(resp.getAllHeaders(), this.headerCookie);//请求返回链接JSONObject jsonObj = JSONObject.parseObject(EntityUtils.toString(resp.getEntity()));System.out.println(jsonObj.toJSONString());this.retcode = jsonObj.getIntValue("retcode");this.uid = jsonObj.getString("uid");this.nick = jsonObj.getString("nick");this.domainurls = jsonObj.getJSONArray("crossDomainUrlList");List<String> retMsg = new ArrayList<String>();int i = 0;for (Object url : domainurls) {get.setURI(new URI(url.toString()+"&callback=sinaSSOController.doCrossDomainCallBack&scriptId=ssoscript"+i+"&client=ssologin.js(v1.4.15)&_="+new Date().getTime())); resp = client.execute(get);retMsg.add(EntityUtils.toString(resp.getEntity()));i++;}get.setURI(new URI("/member/my.php?entry=sso"));//添加请求cookie到请求头get.addHeader("Cookie", this.headerCookie.toString());resp = client.execute(get);String cont = readStreamByEncoding(resp.getEntity().getContent(), "GBK");retMsg.add(cont);for(String s : retMsg) {System.out.println(s);}}private String readStreamByEncoding(InputStream in, String encoding) throws IOException {StringBuffer cont= new StringBuffer();BufferedReader br = new BufferedReader(new InputStreamReader(in , encoding));String tmp = "";while ((tmp = br.readLine())!=null) {cont.append(tmp);}br.close();return cont.toString();}/*** 登录*/public void login() {try {this.preLogin();this.accountLogin();} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (ScriptException e) {e.printStackTrace();} catch (URISyntaxException e) {e.printStackTrace();}}public HttpClient getClient() {return client;}public void setClient(HttpClient client) {this.client = client;}public HttpPost getPost() {return post;}public void setPost(HttpPost post) {this.post = post;}public HttpGet getGet() {return get;}public void setGet(HttpGet get) {this.get = get;}public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getSu() {return su;}public void setSu(String su) {this.su = su;}public String getSp() {return sp;}public void setSp(String sp) {this.sp = sp;}public String getNonce() {return nonce;}public void setNonce(String nonce) {this.nonce = nonce;}public String getRsakv() {return rsakv;}public void setRsakv(String rsakv) {this.rsakv = rsakv;}public String getPubkey() {return pubkey;}public void setPubkey(String pubkey) {this.pubkey = pubkey;}public int getRetcode() {return retcode;}public void setRetcode(int retcode) {this.retcode = retcode;}public String getUid() {return uid;}public void setUid(String uid) {this.uid = uid;}public String getNick() {return nick;}public void setNick(String nick) {this.nick = nick;}public static String getSina_js() {return sina_js;}public BasicCookieStore getCookieStore() {return cookieStore;}public void setCookieStore(BasicCookieStore cookieStore) {this.cookieStore = cookieStore;}public static void main(String[] args) {new SinaWeiboLogger("", "").login();}}登录相当成功,于是我在这代码的基础上加上了些修改,运⾏后代码报 Connection reset 这个错误;经过研究发现其实已经授权成功了,不过在授权成功后页⾯会进⾏两次重定向所以报这个错。

新浪微博移动应用授权机制(@疯子超人)

新浪微博移动应用授权机制(@疯子超人)

新浪微博-手机微博 @疯子超人@MUNTO_AKIRA新浪微博移动应用开发指南——授权机制说明•在/apps中应用创建成功后,将会获得该应用的App Key和Secret Key,您可以通过这两个Key数据开始进行相关的技术开发工作。

•App Key是应用的唯一标识,开放平台通过App Key来鉴别应用的身份。

AppSecret是给应用分配的密钥,开发者需要妥善保存这个密钥,这个密钥用来保证应用来源的的可靠性,防止被伪造。

•Oauth2的授权方式需要校验callback地址,因此也需要开发者在后台配置。

微博应用授权流程第三方应用OAuth2.0认证获取AccessToken操作接口访问信息移动端授权:授权方式:目前新浪微博开放平台仅支持OAuth2.0的用户身份鉴权。

跳转新浪授权页面 Webview 截取SDK SSO 版SDK Oauth2.0 API 跳转微博客户端授权微博客户端3.0 开放服务 可实现方式OAuth2 APIOAuth2/authorize请求用户授权Token●用于标准流程( Authorization Code),发送获取code请求。

●用户直接发放模式( Implicit Grant),直接获取token。

需要校验callback地址。

OAuth2/access_token获取授权过的Access Token●用于已经获得用户授权得到code后换取token●使用客户端认证权限对授权过的用户直接获得用户token。

access_token以2.00开头expires_in以秒为单位用户App API Server6. 请求获得token :https:///oauth 2/access_token 1.用户确认使用微博功能2.发起接口调用请求https:///oauth2/authorize5. 返回code4. 用户授权3. API 返回授权页面 7. 返回tokenStep 1:client_id=2507226428&response_type=code&redirect_uri=https:///oauth2/default.html &display=mobile &with_offical_account=1https:///oauth2/authorize GET/POSTStep 2:https:///oauth2/default.html?code=8502231b847e512ceed1d1c891c00293Step 3:https:///oauth2/access_token POSTclient_id=2507226428&client_secret=16ee5f1933580ff73863010272ec065b&grant_type=authorization_code&code=8502231b847e512ceed1d1c891c00293&redirect_uri=http s:///oauth2/default.htmlaccess_token": "ACCESS_TOKEN", "expires_in": 1234, "remind_in":"798114", "uid":"12341234" }request:Redirect_URI 需先在后台配置或使用绑定域名下的有效地址。

新浪微博Oauth2.0授权 获取Access Token

新浪微博Oauth2.0授权 获取Access Token

新浪微博Oauth2.0授权获取Access Token新浪微博开放平台提供了丰富的API接口,利用这些接口,开发者能够开发出独具特色的微博应用。

但是,大部分接口都需要用户授权给应用,应用利用授权得到的Access Token来调用相应的接口来获取内容。

新浪微博的授权机制目前主要有3种应用场景:1.Web应用2.移动应用3.站内应用本文主要介绍Web应用如何授权、获取Access Token。

步骤一:添加网站步骤二:Oauth2.0授权设置应用创建完后可以在“管理中心”-“我的应用”中查看信息,在“应用信息”--“高级信息”中可以设置网站的授权回调页和取消授权回调页。

授权回调页非常重要,一定要填写正确,当用户授权成功后会回调到此页面,传回一个“code”参数,开发者可以用code换取Access Token值。

步骤三:引导用户授权引导需要授权的用户到如下页面:https:///oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URIYOUR_CLIENT_ID:即应用的AppKey,可以在应用基本信息里查看到。

YOUR_REGISTERED_REDIRECT_URI:即之前填写的授权回调页,注意一定要完全相同。

如果用户授权成功后,会跳转到回调页,开发者此时需要得到url参数中的code值,注意code只能使用一次。

步骤四:换取Access Token开发者可以访问如下页面得到Access Token:https:///oauth2/access_token?client_id=YOUR_CLIENT_ID&client_secret=YOUR _CLIENT_SECRET&grant_type=authorization_code&redirect_uri=YOUR_REGISTERED_REDI RECT_URI&code=CODE这些参数就不一一介绍了。

Android授权登录新浪微博获取用户个人信息汇总

Android授权登录新浪微博获取用户个人信息汇总

Android授权登录新浪微博获取用户个人信息一、准备工作我们都知道,无论是分享到新浪微博,还是获取新浪微博的用户信息,都离不开一样东西,那就是新浪微博的APPID,APPID通过绑定我们应用程序的包名和签名进行识别,可以说它是我们跟新浪微博官方所提供接口进行交互的一个重要令牌,这一点跟QQ、微信接口等访问原理基本是一样的。

那么问题来了,APPID到底怎么得到?答案就是你要到新浪微博开放平台/注册一个帐号,填写并创建你的应用。

如下图所示:点击创建应用后会出现如下图所示页面,在这个页面中你必须要填写你的Android包名和Android签名,包名就是你应用程序AndroidManifest.xml文件中的package中的字符串,比如你新建了一个名称为“test”的项目,那么你的包名应该是com.example.test了。

至于Android 签名,你可以在该开放平台下载签名工具apk装到手机,然后打开该apk填写程序包名获取签名,也可以直接在开发工具eclispe中点击Window->Preferences->Android->Build查看,如下图所示,至于其它必要的填写信息,你自己去完善就可以了将所有信息填写完善后我们点击提交审核,注意,只有审核通过的应用才能调用他们提供的API。

二、工程准备新建一个工程,包名要跟你上面填写的包名一致。

新建完成后下载新浪微博SDK,下载完成后解压,将libs目录下的文件全部拷贝到你的工程libs目录下,将weiboSDKCore_3.1.2.jar 包也拷贝到libs目录下,找到AccessTokenKeeper.Java、UsersAPI.java、AbsOpenAPI.java文件并拷贝到你的包中,我把我的工程目录图贴出来,后面我会把整个示例源码放上来。

注意上面common中的SinaUserInfo.java是我自己建的,只是用来方便存和取用户信息而已。

java动态代理实现Authorization(授权)

java动态代理实现Authorization(授权)

动态代理实现Authorization(授权)*ng.reflect包中的 Proxy和InvocationHandler接口提供了创建(指定类[接口更准确些]的)动态代理类的能力。

我们知道,对象是类的实例,一般使用内存来模拟对象,对象是依据类为模板来创建的,创建时使用new来分配一块内存区(其布局参考相应类的内存布局),为变量做一些赋值便是对象的初始化了。

我们知道通常类是设计时的产物,在设计时我们编写对象的模板(即——类),运行时产生类的实例。

类所处的文件是 .java文件——源文件,之后编译为jvm-----java虚拟机可解释执行的.class字节码文件,在类解析过程中这些.class文件由类加载器加载到虚拟机(可实现自己的类加载器来加载处于特定路径下的类,或加载用某种加密算法加密过的类文件---这样便于进行安全控制——具体描述参考(Core java ——Java核心卷二))。

在遇到创建对象的指令时使用加载的类来创建对象内存空间。

动态代理是不用创建类文件(当然也不用创建java源文件),就能在虚拟机中构造出类文件区域来(相当于使用Proxy类来创建一块类内存区域,该区域中的内容相当于加载某个.class文件产生的区域;比如我们在使用DOM技术时,从一个XML文件构造一个DOM内存表示,它是XML文件的内存表示,但我们也可以直接使用DOM API在内存中构建一个dom树,最终结果就是一个内存DOM树,你不用关心这个dom树是来自于xmL文件还是直接的运行时构造)。

***关于代理设计模式,这里不再敷述。

代理和被代理类(目标类)实现共同的接口。

我们在调用时不需区别它是否是真正的目标对象。

代理会转发请求到目标对象的。

比如互联网上的代理服务器,我们不必关心它是不是代理,就当它不存在一样。

对客户调用端他是不关心具体是谁来提供这个服务功能;在服务端选择使用代理的原因可能是:安全,日志,防火墙等。

就是说代理可提供一些非功能性功能,比如缓存功能____来加速服务的响应的速度。

ASP.NET实现QQ、微信、新浪微博OAuth2.0授权登录

ASP.NET实现QQ、微信、新浪微博OAuth2.0授权登录

不管是腾讯还是新浪,查看他们的API,PHP都是有完整的接口,但对C#支持似乎都不是那么完善,都没有,腾讯是完全没有,新浪是提供第三方的,而且后期还不一定升级,NND,用第三方的动辄就一个类库,各种配置还必须按照他们约定的写,烦而且乱,索性自己写,后期的扩展也容易,看过接口后,开始以为很难,参考了几个源码之后发现也不是那么难,无非是GET或POST请求他们的接口获取返回值之类的,话不多说,这里只提供几个代码共参考,抛砖引玉了。

我这个写法的特点是,用到了Session,使用对象实例化之后调用Login() 跳转到登录页面,在回调页面调用Callback() 执行之后,可以从Session也可以写独立的函数(如:GetOpenID())中获取access_token或用户的唯一标识,以方便做下一步的操作。

所谓绑定就是把用户的唯一标识取出,插入数据库,和帐号绑定起来。

1.首先是所有OAuth类的基类,放一些需要公用的方法public abstract class BaseOAuth{&nbsp; public HttpRequest Request = HttpContext.Current.Request;&nbsp; public HttpResponse Response = HttpContext.Current.Response;&nbsp; public HttpSessionState Session = HttpContext.Current.Session;&nbsp; public abstract void Login();&nbsp; public abstract string Callback();&nbsp; #region 内部使用函数&nbsp; /// &lt;summary&gt;&nbsp; /// 生成唯一随机串防CSRF攻击&nbsp; /// &lt;/summary&gt;&nbsp; /// &lt;returns&gt;&lt;/returns&gt;&nbsp; protected string GetStateCode()&nbsp; {&nbsp; &nbsp; Random rand = new Random();&nbsp; &nbsp; string data = DateTime.Now.ToString("yyyyMMddHHmmssffff") + rand.Next(1, 0xf423f).ToString();&nbsp; &nbsp; MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();&nbsp; &nbsp; byte[] md5byte = puteHash(UTF8Encoding.Default.GetBytes(data));&nbsp; &nbsp; return BitConverter.ToString(md5byte).Replace("-", "");&nbsp; }&nbsp; /// &lt;summary&gt;&nbsp; /// GET请求&nbsp; /// &lt;/summary&gt;&nbsp; /// &lt;param name="url"&gt;&lt;/param&gt;&nbsp; /// &lt;returns&gt;&lt;/returns&gt;&nbsp; protected string GetRequest(string url)&nbsp; {&nbsp; &nbsp; HttpWebRequest httpWebRequest = .WebRequest.Create(url) asHttpWebRequest;&nbsp; &nbsp; httpWebRequest.Method = "GET";&nbsp; &nbsp; httpWebRequest.ServicePoint.Expect100Continue = false;&nbsp; &nbsp; StreamReader responseReader = null;&nbsp; &nbsp; string responseData;&nbsp; &nbsp; try&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; responseReader = new StreamReader(httpWebRequest.GetResponse().GetResponseStream());&nbsp; &nbsp; &nbsp; responseData = responseReader.ReadToEnd();&nbsp; &nbsp; }&nbsp; &nbsp; finally&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; httpWebRequest.GetResponse().GetResponseStream().Close();&nbsp; &nbsp; &nbsp; responseReader.Close();&nbsp; &nbsp; }&nbsp; &nbsp; return responseData;&nbsp; }&nbsp; /// &lt;summary&gt;&nbsp; /// POST请求&nbsp; /// &lt;/summary&gt;&nbsp; /// &lt;param name="url"&gt;&lt;/param&gt;&nbsp; /// &lt;param name="postData"&gt;&lt;/param&gt;&nbsp; /// &lt;returns&gt;&lt;/returns&gt;&nbsp; protected string PostRequest(string url, string postData)&nbsp; {&nbsp; &nbsp; HttpWebRequest httpWebRequest = .WebRequest.Create(url) as HttpWebRequest;&nbsp; &nbsp; httpWebRequest.Method = "POST";&nbsp; &nbsp; httpWebRequest.ServicePoint.Expect100Continue = false;&nbsp; &nbsp; httpWebRequest.ContentType = "application/x-www-form-urlencoded";&nbsp; &nbsp; //写入POST参数&nbsp; &nbsp; StreamWriter requestWriter = new StreamWriter(httpWebRequest.GetRequestStream());&nbsp; &nbsp; try&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; requestWriter.Write(postData);&nbsp; &nbsp; }&nbsp; &nbsp; finally&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; requestWriter.Close();&nbsp; &nbsp; }&nbsp; &nbsp; //读取请求后的结果&nbsp; &nbsp; StreamReader responseReader = null;&nbsp; &nbsp; string responseData;&nbsp; &nbsp; try&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; responseReader = new StreamReader(httpWebRequest.GetResponse().GetResponseStream());&nbsp; &nbsp; &nbsp; responseData = responseReader.ReadToEnd();&nbsp; &nbsp; }&nbsp; &nbsp; finally&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; httpWebRequest.GetResponse().GetResponseStream().Close();&nbsp; &nbsp; &nbsp; responseReader.Close();&nbsp; &nbsp; }&nbsp; &nbsp; return responseData;&nbsp; }&nbsp; /// &lt;summary&gt;&nbsp; /// 解析JSON&nbsp; /// &lt;/summary&gt;&nbsp; /// &lt;param name="strJson"&gt;&lt;/param&gt;&nbsp; /// &lt;returns&gt;&lt;/returns&gt;&nbsp; protected NameValueCollection ParseJson(string strJson)&nbsp; {&nbsp; &nbsp; NameValueCollection mc = new NameValueCollection();&nbsp; &nbsp; Regex regex = new Regex(@"(\s*\bsp; }&nbsp; &nbsp; foreach (Match m in regex.Matches(strJson))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; mc.Add(m.Groups[2].V alue, m.Groups[3].Value);&nbsp; &nbsp; }&nbsp; &nbsp; return mc;&nbsp; }&nbsp; /// &lt;summary&gt;&nbsp; /// 解析URL&nbsp; /// &lt;/summary&gt;&nbsp; /// &lt;param name="strParams"&gt;&lt;/param&gt;&nbsp; /// &lt;returns&gt;&lt;/returns&gt;&nbsp; protected NameValueCollection ParseUrlParameters(string strParams)&nbsp; {&nbsp; &nbsp; NameValueCollection nc = new NameValueCollection();&nbsp; &nbsp; foreach (string p in strParams.Split('&amp;'))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; string[] ps = p.Split('=');&nbsp; &nbsp; &nbsp; nc.Add(ps[0], ps[1]);&nbsp; &nbsp; }&nbsp; &nbsp; return nc;&nbsp; }&nbsp; #endregion}2.QQ的OAuth类public class QQOAuth : BaseOAuth{&nbsp; public string AppId = ConfigurationManager.AppSettings["OAuth_QQ_AppId"];&nbsp; public string AppKey = ConfigurationManager.AppSettings["OAuth_QQ_AppKey"];&nbsp; public string RedirectUrl = ConfigurationManager.AppSettings["OAuth_QQ_RedirectUrl"];&nbsp; public const string GET_AUTH_CODE_URL = "https:///oauth2.0/authorize";&nbsp; public const string GET_ACCESS_TOKEN_URL = "https:///oauth2.0/token";&nbsp; public const string GET_OPENID_URL = "https:///oauth2.0/me";&nbsp; /// &lt;summary&gt;&nbsp; /// QQ登录,跳转到登录页面&nbsp; /// &lt;/summary&gt;&nbsp; public override void Login()&nbsp; {&nbsp; &nbsp; //-------生成唯一随机串防CSRF攻击&nbsp; &nbsp; string state = GetStateCode();&nbsp; &nbsp; Session["QC_State"] = state; //state 放入Session&nbsp; &nbsp; string parms = "?response_type=code&amp;"&nbsp; &nbsp; &nbsp; + "client_id=" + AppId + "&amp;redirect_uri=" + Uri.EscapeDataString(RedirectUrl) + "&amp;state=" + state;&nbsp; &nbsp; string url = GET_AUTH_CODE_URL + parms;&nbsp; &nbsp; Response.Redirect(url); //跳转到登录页面&nbsp; }&nbsp; /// &lt;summary&gt;&nbsp; /// QQ回调函数&nbsp; /// &lt;/summary&gt;&nbsp; /// &lt;param name="code"&gt;&lt;/param&gt;&nbsp; /// &lt;param name="state"&gt;&lt;/param&gt;&nbsp; /// &lt;returns&gt;&lt;/returns&gt;&nbsp; public override string Callback()&nbsp; {&nbsp; &nbsp; string code = Request.QueryString["code"];&nbsp; &nbsp; string state = Request.QueryString["state"];&nbsp; &nbsp; //--------验证state防止CSRF攻击&nbsp; &nbsp; if (state != (string)Session["QC_State"])&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; ShowError("30001");&nbsp; &nbsp; }&nbsp; &nbsp; string parms = "?grant_type=authorization_code&amp;"&nbsp; &nbsp; &nbsp; + "client_id=" + AppId + "&amp;redirect_uri=" + Uri.EscapeDataString(RedirectUrl)&nbsp; &nbsp; &nbsp; + "&amp;client_secret=" + AppKey + "&amp;code=" + code;&nbsp; &nbsp; string url = GET_ACCESS_TOKEN_URL + parms;&nbsp; &nbsp; string str = GetRequest(url);&nbsp; &nbsp; if (str.IndexOf("callback") != -1)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; int lpos = str.IndexOf("(");&nbsp; &nbsp; &nbsp; int rpos = str.IndexOf(")");&nbsp; &nbsp; &nbsp; str = str.Substring(lpos + 1, rpos - lpos - 1);&nbsp; &nbsp; &nbsp; NameValueCollection msg = ParseJson(str);&nbsp; &nbsp; &nbsp; if (!string.IsNullOrEmpty(msg["error"]))&nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; ShowError(msg["error"], msg["error_description"]);&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; NameValueCollection token = ParseUrlParameters(str);&nbsp; &nbsp; Session["QC_AccessToken"] = token["access_token"]; //access_token 放入Session&nbsp; &nbsp; return token["access_token"];&nbsp; }&nbsp; /// &lt;summary&gt;&nbsp; /// 使用Access Token来获取用户的OpenID&nbsp; /// &lt;/summary&gt;&nbsp; /// &lt;param name="accessToken"&gt;&lt;/param&gt;&nbsp; /// &lt;returns&gt;&lt;/returns&gt;&nbsp; public string GetOpenID()&nbsp; {&nbsp; &nbsp; string parms = "?access_token=" + Session["QC_AccessToken"];&nbsp; &nbsp; string url = GET_OPENID_URL + parms;&nbsp; &nbsp; string str = GetRequest(url);&nbsp; &nbsp; if (str.IndexOf("callback") != -1)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; int lpos = str.IndexOf("(");&nbsp; &nbsp; &nbsp; int rpos = str.IndexOf(")");&nbsp; &nbsp; &nbsp; str = str.Substring(lpos + 1, rpos - lpos - 1);&nbsp; &nbsp; }&nbsp; &nbsp; NameValueCollection user = ParseJson(str);&nbsp; &nbsp; if (!string.IsNullOrEmpty(user["error"]))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; ShowError(user["error"], user["error_description"]);&nbsp; &nbsp; }&nbsp; &nbsp; Session["QC_OpenId"] = user["openid"]; //openid 放入Session&nbsp; &nbsp; return user["openid"];&nbsp; }&nbsp; /// &lt;summary&gt;&nbsp; /// 显示错误信息&nbsp; /// &lt;/summary&gt;&nbsp; /// &lt;param name="code"&gt;错误编号&lt;/param&gt;&nbsp; /// &lt;param name="description"&gt;错误描述&lt;/param&gt;&nbsp; private void ShowError(string code, string description = null)&nbsp; {&nbsp; &nbsp; if (description == null)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; switch (code)&nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; case "20001":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; description = "&lt;h2&gt;配置文件损坏或无法读取,请检查web.config&lt;/h2&gt;";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; case "30001":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; description = "&lt;h2&gt;The state does not match. You may be a victim of CSRF.&lt;/h2&gt;";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; case "50001":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; description = "&lt;h2&gt;可能是服务器无法请求https协议&lt;/h2&gt;可能未开启curl支持,请尝试开启curl支持,重启web服务器,如果问题仍未解决,请联系我们";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; description = "&lt;h2&gt;系统未知错误,请联系我们&lt;/h2&gt;";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; Response.Write(description);&nbsp; &nbsp; &nbsp; Response.End();&nbsp; &nbsp; }&nbsp; &nbsp; else&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; Response.Write("&lt;h3&gt;error:&lt;h3&gt;" + code + "&lt;h3&gt;msg:&lt;h3&gt;" + description);&nbsp; &nbsp; &nbsp; Response.End();&nbsp; &nbsp; }&nbsp; }}3.新浪微博的OAuth类public class SinaOAuth : BaseOAuth{&nbsp; public string AppKey = ConfigurationManager.AppSettings["OAuth_Sina_AppKey"];&nbsp; public string AppSecret = ConfigurationManager.AppSettings["OAuth_Sina_AppSecret"];&nbsp; public string RedirectUrl = ConfigurationManager.AppSettings["OAuth_Sina_RedirectUrl"];&nbsp; public const string GET_AUTH_CODE_URL = "https:///oauth2/authorize";&nbsp; public const string GET_ACCESS_TOKEN_URL = "https:///oauth2/access_token";&nbsp; public const string GET_UID_URL = "https:///2/account/get_uid.json";&nbsp; /// &lt;summary&gt;&nbsp; /// 新浪微博登录,跳转到登录页面&nbsp; /// &lt;/summary&gt;&nbsp; public override void Login()&nbsp; {&nbsp; &nbsp; //-------生成唯一随机串防CSRF攻击&nbsp; &nbsp; string state = GetStateCode();&nbsp; &nbsp; Session["Sina_State"] = state; //state 放入Session&nbsp; &nbsp; string parms = "?client_id=" + AppKey + "&amp;redirect_uri=" + Uri.EscapeDataString(RedirectUrl)&nbsp; &nbsp; &nbsp; + "&amp;state=" + state;&nbsp; &nbsp; string url = GET_AUTH_CODE_URL + parms;&nbsp; &nbsp; Response.Redirect(url); //跳转到登录页面&nbsp; }&nbsp; /// &lt;summary&gt;&nbsp; /// 新浪微博回调函数&nbsp; /// &lt;/summary&gt;&nbsp; /// &lt;returns&gt;&lt;/returns&gt;&nbsp; public override string Callback()&nbsp; {&nbsp; &nbsp; string code = Request.QueryString["code"];&nbsp; &nbsp; string state = Request.QueryString["state"];&nbsp; &nbsp; //--------验证state防止CSRF攻击&nbsp; &nbsp; if (state != (string)Session["Sina_State"])&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; ShowError("The state does not match. You may be a victim of CSRF.");&nbsp; &nbsp; }&nbsp; &nbsp; string parms = "client_id=" + AppKey + "&amp;client_secret=" + AppSecret &nbsp; &nbsp; &nbsp; + "&amp;grant_type=authorization_code&amp;code=" + code + "&amp;redirect_uri=" + Uri.EscapeDataString(RedirectUrl);&nbsp; &nbsp; string str = PostRequest(GET_ACCESS_TOKEN_URL, parms);&nbsp; &nbsp; NameValueCollection user = ParseJson(str);&nbsp; &nbsp; Session["Sina_AccessToken"] = user["access_token"]; //access_token 放入Session&nbsp; &nbsp; Session["Sina_UId"] = user["uid"]; //uid 放入Session&nbsp; &nbsp; return user["access_token"];&nbsp; }&nbsp; /// &lt;summary&gt;&nbsp; /// 显示错误信息&nbsp; /// &lt;/summary&gt;&nbsp; /// &lt;param name="description"&gt;错误描述&lt;/param&gt;&nbsp; private void ShowError(string description = null)&nbsp; {&nbsp; &nbsp; Response.Write("&lt;h2&gt;" + description + "&lt;/h2&gt;");&nbsp; &nbsp; Response.End();&nbsp; }}4.微信的OAuth类public class WeixinOAuth : BaseOAuth{&nbsp; public string AppId = ConfigurationManager.AppSettings["OAuth_Weixin_AppId"];&nbsp; public string AppSecret = ConfigurationManager.AppSettings["OAuth_Weixin_AppSecret"];&nbsp; public string RedirectUrl = ConfigurationManager.AppSettings["OAuth_Weixin_RedirectUrl"];&nbsp; public const string GET_AUTH_CODE_URL = "https:///connect/qrconnect";&nbsp; public const string GET_ACCESS_TOKEN_URL = "https:///sns/oauth2/access_token";&nbsp; public const string GET_USERINFO_URL = "https:///sns/userinfo";&nbsp; /// &lt;summary&gt;&nbsp; /// 微信登录,跳转到登录页面&nbsp; /// &lt;/summary&gt;&nbsp; public override void Login()&nbsp; {&nbsp; &nbsp; //-------生成唯一随机串防CSRF攻击&nbsp; &nbsp; string state = GetStateCode();&nbsp; &nbsp; Session["Weixin_State"] = state; //state 放入Session&nbsp; &nbsp; string parms = "?appid=" + AppId&nbsp; &nbsp; &nbsp; + "&amp;redirect_uri=" + Uri.EscapeDataString(RedirectUrl) + "&amp;response_type=code&amp;scope=snsapi_login"&nbsp; &nbsp; &nbsp; + "&amp;state=" + state + "#wechat_redirect";&nbsp; &nbsp; string url = GET_AUTH_CODE_URL + parms;&nbsp; &nbsp; Response.Redirect(url); //跳转到登录页面&nbsp; }&nbsp; /// &lt;summary&gt;&nbsp; /// 微信回调函数&nbsp; /// &lt;/summary&gt;&nbsp; /// &lt;param name="code"&gt;&lt;/param&gt;&nbsp; /// &lt;param name="state"&gt;&lt;/param&gt;&nbsp; /// &lt;returns&gt;&lt;/returns&gt;&nbsp; public override string Callback()&nbsp; {&nbsp; &nbsp; string code = Request.QueryString["code"];&nbsp; &nbsp; string state = Request.QueryString["state"];&nbsp; &nbsp; //--------验证state防止CSRF攻击&nbsp; &nbsp; if (state != (string)Session["Weixin_State"])&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; ShowError("30001");&nbsp; &nbsp; }&nbsp; &nbsp; string parms = "?appid=" + AppId + "&amp;secret=" + AppSecret&nbsp; &nbsp; &nbsp; + "&amp;code=" + code + "&amp;grant_type=authorization_code";&nbsp; &nbsp; string url = GET_ACCESS_TOKEN_URL + parms;&nbsp; &nbsp; string str = GetRequest(url);&nbsp; &nbsp; NameValueCollection msg = ParseJson(str);&nbsp; &nbsp; if (!string.IsNullOrEmpty(msg["errcode"]))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; ShowError(msg["errcode"], msg["errmsg"]);&nbsp; &nbsp; }&nbsp; &nbsp; Session["Weixin_AccessToken"] = msg["access_token"]; //access_token 放入Session&nbsp; &nbsp; Session["Weixin_OpenId"] = msg["openid"]; //access_token 放入Session &nbsp; &nbsp; return msg["access_token"];&nbsp; }&nbsp; /// &lt;summary&gt;&nbsp; /// 显示错误信息&nbsp; /// &lt;/summary&gt;&nbsp; /// &lt;param name="code"&gt;错误编号&lt;/param&gt;&nbsp; /// &lt;param name="description"&gt;错误描述&lt;/param&gt;&nbsp; private void ShowError(string code, string description = null)&nbsp; {&nbsp; &nbsp; if (description == null)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; switch (code)&nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; case "20001":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; description = "&lt;h2&gt;配置文件损坏或无法读取,请检查web.config&lt;/h2&gt;";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; case "30001":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; description = "&lt;h2&gt;The state does not match. You may be a victim of CSRF.&lt;/h2&gt;";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; case "50001":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; description = "&lt;h2&gt;接口未授权&lt;/h2&gt;";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; description = "&lt;h2&gt;系统未知错误,请联系我们&lt;/h2&gt;";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; Response.Write(description);&nbsp; &nbsp; &nbsp; Response.End();&nbsp; &nbsp; }&nbsp; &nbsp; else&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; Response.Write("&lt;h3&gt;error:&lt;h3&gt;" + code + "&lt;h3&gt;msg:&lt;h3&gt;" + description);&nbsp; &nbsp; &nbsp; Response.End();&nbsp; &nbsp; }&nbsp; }}5.web.config配置信息&lt;appSettings&gt;&nbsp; &nbsp; &lt;!--QQ登录相关配置--&gt;&nbsp; &nbsp; &lt;add key="OAuth_QQ_AppId" value="123456789" /&gt;&nbsp; &nbsp; &lt;add key="OAuth_QQ_AppKey" value="25f9e794323b453885f5181f1b624d0b" /&gt;&nbsp; &nbsp; &lt;add key="OAuth_QQ_RedirectUrl" value="/oauth20/qqcallback.aspx" /&gt;&nbsp; &nbsp; &lt;!--新浪微博登录相关配置--&gt;&nbsp; &nbsp; &lt;add key="OAuth_Sina_AppKey" value="123456789" /&gt;&nbsp; &nbsp; &lt;add key="OAuth_Sina_AppSecret" value="25f9e794323b453885f5181f1b624d0b" /&gt;&nbsp; &nbsp; &lt;add key="OAuth_Sina_RedirectUrl" value="/oauth20/sinacallback.aspx" /&gt;&nbsp; &nbsp; &lt;!--微信登录相关配置--&gt;&nbsp; &nbsp; &lt;add key="OAuth_Weixin_AppId" value="wx123456789123" /&gt;&nbsp; &nbsp; &lt;add key="OAuth_Weixin_AppSecret" value="25f9e794323b453885f5181f1b624d0b" /&gt;&nbsp; &nbsp; &lt;add key="OAuth_Weixin_RedirectUrl" value="/oauth20/weixincallback.aspx" /&gt;&lt;/appSettings&gt;。

新浪微博OAuth授权的Java实现

新浪微博OAuth授权的Java实现

新浪微博OAuth授权的Java实现2011-05-24 22:21:35| 分类:java | 标签:新浪weibo oauth java sina |字号大中小订阅一、OAuth协议简介OAuth授权在各社交网站中广泛使用,该协议使用户不需要直接向第三方应用提供用户名及密码,并且使一个账户在多个网站中使用成为可能,OAuth协议的细节描述可参考其官方网站:目前OAuth 1.0已经出了final version,即RFC 5849,OAuth 2.0也已在起草中。

这篇文章中,我想用比较通俗的语言来解释OAuth协议。

OAuth协议中包含了三个角色:Service Provdier,即服务提供者,如新浪微博;User,即普通用户,如新浪微博用户;Consumer,即第三方应用,如本人开发的应用。

现有如下场景:User想利用Consumer来更新自己在Service Provider中的状态,但此时Service Provider并不信任Consumer,且User也不想把帐号和密码告诉Consumer,于是三者之间需要建立起信任关系。

Consumer首先要向Service Provider申请一对Consumer_Key和Consumer_Secret,以此取得Service Provider的信任。

因为User是信任Service Provider的,所以User与Consumer间的信任关系需要借助Service Provider来建立。

Consumer用自己的Consumer_Key和Consumer_Secret向Service Provider请求到一对Request_Token和Request_Token_Secret,而后Consumer拿上这对RequestToken,领着User 去见Service Provider。

Service Provider见到自己发的RequestToken,便确认Consumer是值得信任的,于是把头转向User。

java写的auth0例子

java写的auth0例子

java写的auth0例子【最新版】目录1.Auth0 简介2.Java 编写 Auth0 认证例子的步骤3.编写过程中遇到的问题及解决方案4.代码示例5.总结正文Auth0 是一家提供身份验证和授权服务的公司,其主要产品是 Auth0 API。

Auth0 API 可以让开发者轻松地将身份验证和授权功能集成到自己的应用程序中。

Auth0 支持多种身份验证方式,如密码、社交媒体登录、多因素身份验证等。

同时,Auth0 也提供了丰富的权限管理功能,可以让开发者轻松地控制用户对不同资源的访问权限。

本文将介绍如何使用 Java 编写一个 Auth0 认证的例子。

在开始编写代码之前,我们需要首先在 Auth0 的网站上注册一个账号,并创建一个认证应用。

创建认证应用时,我们需要提供一些必要的信息,如应用程序的名称、主页 URL、授权回调 URL 等。

在创建好认证应用后,我们就可以开始编写 Java 代码了。

以下是一个简单的 Java 编写 Auth0 认证例子的步骤:1.引入 Auth0 SDK在项目中引入 Auth0 的 Java SDK,可以使用 Maven 或 Gradle 将依赖项添加到项目中。

```xml<!-- Maven --><dependency><groupId>com.auth0</groupId><artifactId>java-auth0</artifactId><version>3.18.1</version></dependency><!-- Gradle -->implementation "com.auth0:java-auth0:3.18.1"```2.创建 Auth0 客户端创建一个 Auth0 客户端实例,需要提供认证应用的 Client ID 和Client Secret。

新浪微博API java开发

新浪微博API java开发

新浪微博API java开发分类:JAVA2012-02-20 10:10 909人阅读评论(1) 收藏举报这几天新浪微博账号被盗,导致多出了700个关注,手动删除是在蛋疼,决定写个程序批量删除。

首先申请开发者,这些不再赘述,总之最都得到一个App key 和App Secret,在工程下的config.properties中填入。

进入 进入你的应用,【应用信息】-【高级信息】-【授权地址】,填写授权地址(随便能访问的网址)在工程下config.properties中将你刚刚填写的授权地址加入redirect_url;在高级信息的低端加入测试用户uid(就是新浪微博地址后面的那串数字);新浪微博中有很多API是需要登陆验证的,新浪使用了Oauth2.0,大概流程是你首先提交你的应用信息,这时会弹出授权页面,在授权后,会跳转到你所填写的授权地址。

在URL中有一串code(浏览器地址栏中),将code输入控制台,此时便得到了授权,得到一个access_token对象。

在Oauth2.0方式下,access_token对象是基本每个API都必须的参数。

如何调用API 下面用获取用户关注信息为例;[java]view plaincopy1. //获取授权2. Oauth oauth = new Oauth();3. BareBonesBrowserLaunch.openURL(oauth.authorize("code"));4. System.out.println(oauth.authorize("code"));5. System.out.print("Hit enter when it's done.[Enter]:");6. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));7. //等待控制台输入code8. String code = br.readLine();9. AccessToken accessToken = oauth.getAccessTokenByCode(code);10.//设置token,一次就行11. Weibo weibo = new Weibo();12. weibo.setToken(accessToken.toString());13.14.<span style="white-space:pre"> </span>UserWapper __userWapper = getFriends(accessToken,accessToken.getUid(),current);15.<span style="white-space:pre"> </span>16.<span style="white-space:pre">17.</span>1.public static UserWapper getFriends(AccessToken accessToken,2. String uid, int cursor) throws WeiboException{3. UserWapper userWapper =4. User.constructWapperUsers( Weibo.client.get(5. WeiboConfig.getValue("baseURL")6. + "friendships/friends.json",7.new PostParameter[] {8.new PostParameter("access_token", accessToken.getAccessToken().toString()),9.new PostParameter("uid", uid) ,10.new PostParameter("count", 200),11.new PostParameter("cursor", cursor)12. }13. )14. );15.return userWapper;16. }下面是我的所有代码功能是取消一个用户的关注能够取消最近关注的N个用户OAuth简介及sina微博开放平台2010-10-26 13:15:25标签:新浪sina微博OAuth开放平台原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。

新浪微博的API

新浪微博的API

1,开发流程技术规范与指南目录隐藏∙ 1 概述∙ 2 开发流程o 2.1 申请APPKEYo 2.2 应用创建及发布流程∙ 3 开发指南o 3.1 SDK简介及作用o 3.2 如何通过授权访问数据3.2.1 OAUTH认证o 3.3 如何访问匿名接口o 3.4 接口数据如何适当的缓存o 3.5 如何避免rate limito 3.6 技术咨询和建议通过何种途径询问概述API平台应用日益丰富,为了让开发者更容易了解开发流程;为了规范API的接口,需要制定开发规范;为了对开发者进行一些深层次的指导,让开发者怎样来最优的访问API接口,特此制定开发流程技术规范与指南。

开发流程申请APPKEY1. 进入2. 如果您有新浪微博账户,可以直接登录,没有则注册一个微博账户后登录3. 登录后进入我的应用,创建一个应用4. 创建完成后会生成对应的appkey,app_secret,记住:您的app_key别对外泄露。

应用创建及发布流程应用的创建及发布包括下面的流程,开发者可以根据应用当前的状态进行相应的操作开发指南SDK简介及作用SDK是特定语言实现的一个可以通用的API使用的工具,SDK实现了新浪开放平台的全部或大部分接口,以便开发者不用关心API接口细节,认证实现等,可以直接调用接口完成特定的功能。

支持新浪微博开放平台接口的SDK语言包括Adobe air,c++,c#,java,php,python,ios等,具体请参考SDK列表页面如何通过授权访问数据微博开放平台对外支持两种用户认证方式,Basic auth以及OAUTH认证微博开放平台对外支持两种用户认证方式,Basic auth以及OAUTH认证OAUTH认证OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。

关于OAUTH协议可以参考使用OAUTH认证来获取微博数据介绍详细见:OAuth如何访问匿名接口为了方便一些应用在没有用户认证情况下需要获取一些数据,微博开放平台提供了一些匿名访问接口。

java实现的新浪微博分享代码实例

java实现的新浪微博分享代码实例

java实现的新浪微博分享代码实例java实现的新浪微博分享代码实例这篇文章主要介绍了java实现的新浪微博分享代码实例,是通过新浪API获得授权,然后接受客户端请求的数据,第三方应用发送请求消息到微博,唤起微博分享界面,非常的实用,有相同需要的小伙伴可以参考下。

weibo.java复制代码代码如下:@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(er_center);//创建微博实例mWeiboAuth=newWeiboAuth(this,Constants.APP_KEY,Constants.REDIRECT_URL,Constants.SCOPE);//创建微博分享接口实例mWeiboShareAPI=WeiboShareSDK.createWeiboAPI(this,Co nstants.APP_KEY);//当Activity被重新初始化时(该Activity处于后台时,可能会由于内存不足被杀掉了),//需要调用{@linkIWeiboShareAPI#handleWeiboResponse}来接收微博客户端返回的数据。

//执行成功,返回true,并调用{@linkIWeiboHandler.Response#onResponse};//失败返回false,不调用上述回调if(savedInstanceState!=null){mWeiboShareAPI.handleWeiboResponse(getIntent(),this);}}/检查用户是否安装新浪微博/publicvoidisNotInstall(){try{//检查微博客户端环境是否正常,如果未安装微博,弹出对话框询问用户下载微博客户端if(mWeiboShareAPI.checkEnvironment(true)){//注册第三方应用到微博客户端中,注册成功后该应用将显示在微博的应用列表中。

基于javaweb的微博系统的设计和实现

基于javaweb的微博系统的设计和实现

数据库类型: MySQL
数据库表结构: 用户表、微博 表、评论表、
关注表等
数据库字段设 计:用户ID、 用户名、密码、 微博内容、评 论内容、关注
用户ID等
数据库索引设 计:对常用查 询字段建立索 引,提高查询
效率。
界面布局:采用响应式设计,适应 各种屏幕尺寸
内容展示:采用瀑布流布局,支持 图片、文字、视频等多种形式
系统测试与优化
单元测试的概念: 对软件中的最小可 测试单元进行测试
单元测试的目的: 验证软件模块的正 确性和稳定性
单元测试的方法: 白盒测试、黑盒测 试、灰盒测试
单元测试的步骤: 编写测试用例、执 行测试用例、分析 测试结果、优化代 码
测试目的:验 证系统各个模 块之间的集成
是否正确
测试方法:采 用黑盒测试和 白盒测试相结
合的方法
测试内容:包 括功能测试、 性能测试、安
全性测试等
测试结果:对 测试结果进行 分析,找出存 在的问题并优
化系统
优化数据库设计,提高查询效率
优化代码结构,提高代码可读性和 可维护性
添加标题
添加标题
优化页面布局,提高用户体验
添加标题
添加标题
优化系统性能,提高系统响应速度 和稳定性
总结与展望
技术选型:JavaWeb技术栈,包括Spring、 MyBatis等框架
添加标题
个人中心:用户可以 查看自己的微博、粉 丝、关注等信息,进 行个性化设置
添加标题
管理员功能:管理员 可以管理用户、微博、 评论等信息,进行系 统维护和优化。
系统设计Βιβλιοθήκη 前端设计:采用HTML、CSS、JavaScript等技术,实现用户界面和交互功能 后端设计:采用Java语言和Spring框架,实现业务逻辑和数据库操作 数据库设计:采用MySQL数据库,存储用户信息、微博内容、评论等信息 网络设计:采用HTTP协议进行通信,实现客户端和服务器之间的数据传输

java构建OAuth2授权服务器

java构建OAuth2授权服务器

java构建OAuth2授权服务器⽬录构建 OAuth2 授权服务器设置客户端和⽤户认证信息设置客户端信息设置⽤户认证信息⽣成 Token构建 OAuth2 授权服务器从表现形式上看,OAuth2 授权服务器也是⼀个独⽴的微服务,因此构建授权服务器的⽅法也是创建⼀个 SpringBoot 应⽤程序,我们需要引⼊对应的 Maven 依赖,如下所⽰:<dependency><groupId>org.springframework.security.oauth</groupId><artifactId>spring-security-oauth2</artifactId></dependency>这⾥的 spring-security-oauth2 就是来⾃ Spring Security 中的 OAuth2 库。

现在 Maven 依赖已经添加完毕,下⼀步就是构建 Bootstrap 类作为访问的⼊⼝:@SpringBootApplication@EnableAuthorizationServerpublic class AuthServer {public static void main(String[] args) {SpringApplication.run(AuthServer.class, args);}}请注意,这⾥出现了⼀个新的注解 @EnableAuthorizationServer,这个注解的作⽤在于为微服务运⾏环境提供⼀个基于 OAuth2 协议的授权服务,该授权服务会暴露⼀系列基于 RESTful 风格的端点(例如 /oauth/authorize 和 /oauth/token)供 OAuth2 授权流程使⽤。

构建 OAuth2 授权服务只是集成 OAuth2 协议的第⼀步,授权服务器是⼀种集中式系统,管理着所有与安全性流程相关的客户端和⽤户信息。

oauth2java代码示例

oauth2java代码示例

oauth2java代码⽰例@RequestMapping("/oauth")@Controllerpublic class OauthController {String clientId = "clientId";String clientSecret = "clientSecret";String response_type = "code";String authorizationCode = "authorizationCode";String redirectUrlPage = "redirectUrlPage";/*** 请求通过凭证地址*/String getAccessTokenURL = "http://localhost:8080/subaccountServer/oauth/getAccessToken";/*** 请求资源地址*/String userInfoUrl = "http://localhost:8080/subaccountServer/oauth/getResource";/*** 重定向到请求授权码的url* @return* @throws Exception*/@RequestMapping("/redirectToRequestAuthorizationCodeURL")public String redirectToRequestAuthorizationCodeURL() throws Exception {String url = "getAuthorizationCode";// accessTokenRequest 是⽤来描述请求对象的,描述了请求地址,和请求参数OAuthClientRequest accessTokenRequest = OAuthClientRequest.authorizationLocation(url).setResponseType(response_type).setClientId(clientId).setRedirectURI( redirectUrlPage ).buildQueryMessage();return "redirect:" + accessTokenRequest.getLocationUri();}/*** 返回授权码* @param model* @param request* @return* @throws Exception*/@RequestMapping("/getAuthorizationCode")public Object getAuthorizationCode(Model model, HttpServletRequest request) throws Exception {OAuthAuthzRequest oauthRequest = new OAuthAuthzRequest(request);String redirectURI = oauthRequest.getParam(OAuth.OAUTH_REDIRECT_URI);String clientId = oauthRequest.getClientId();String responseType = oauthRequest.getParam(OAuth.OAUTH_RESPONSE_TYPE);//得到数据以后应该检查数据//把 state 写到⼀个重定向的响应OAuthASResponse.OAuthAuthorizationResponseBuilder builder = OAuthASResponse.authorizationResponse(request, HttpServletResponse.SC_FOUND); builder.setCode(authorizationCode);OAuthResponse response = builder.location(redirectURI).buildQueryMessage();return "redirect:" + response.getLocationUri();}/*** 请求通过凭证* @param request* @return* @throws Exception*/@RequestMapping("/redirectUrlPage")public Object redirectUrlPage(HttpServletRequest request) throws Exception {String code = request.getParameter("code");OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient());OAuthClientRequest accessTokenRequest = OAuthClientRequest.tokenLocation(getAccessTokenURL).setGrantType(GrantType.AUTHORIZATION_CODE).setClientId(clientId).setClientSecret(clientSecret).setCode(code).setRedirectURI(redirectUrlPage).buildQueryMessage();OAuthAccessTokenResponse oAuthResponse = oAuthClient.accessToken(accessTokenRequest, OAuth.HttpMethod.POST);//得到通过凭证和过期时间String accessToken = oAuthResponse.getAccessToken();Long expiresIn = oAuthResponse.getExpiresIn();return "redirect:requestResourcePage?accessToken=" + accessToken;}/*** 返回通过凭证* @param request* @return* @throws Exception*/@RequestMapping(value = "/getAccessToken", method = RequestMethod.POST)public HttpEntity<String> getAccessToken(HttpServletRequest request) throws Exception {// 构建OAuth请求OAuthTokenRequest oauthRequest = new OAuthTokenRequest(request);String authCode = oauthRequest.getParam(OAuth.OAUTH_CODE);String clientSecret = oauthRequest.getClientSecret();//应该验证授权码// ⽣成Access TokenOAuthIssuer oauthIssuer = new OAuthIssuerImpl(new MD5Generator());String accessToken = oauthIssuer.accessToken();OAuthResponse response = OAuthASResponse.tokenResponse(HttpServletResponse.SC_OK).setAccessToken(accessToken).setExpiresIn("120").buildJSONMessage(); return new ResponseEntity<String>(response.getBody(), HttpStatus.valueOf(response.getResponseStatus()));}/*** 请求资源* @param accessToken* @return* @throws Exception*/@RequestMapping("/requestResourcePage")@ResponseBodypublic String requestResourcePage(String accessToken) throws Exception {OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient());OAuthClientRequest userInfoRequest = new OAuthBearerClientRequest(userInfoUrl).setAccessToken(accessToken).buildQueryMessage();OAuthResourceResponse resourceResponse = oAuthClient.resource(userInfoRequest, OAuth.HttpMethod.GET,OAuthResourceResponse.class);String resource = resourceResponse.getBody();return resource;}/*** 返回资源* @param request* @return* @throws Exception*/@RequestMapping("/getResource")public HttpEntity<String> getResource(HttpServletRequest request) throws Exception {OAuthAccessResourceRequest oauthRequest = new OAuthAccessResourceRequest(request, ParameterStyle.QUERY);String accessToken = oauthRequest.getAccessToken();//这⾥应该验证accessTokenreturn new ResponseEntity<String>("我就是资源", HttpStatus.OK);}}需要的oauth 依赖:<dependency><groupId>org.apache.oltu.oauth2</groupId><artifactId>org.apache.oltu.oauth2.client</artifactId><version>1.0.1</version></dependency><dependency><groupId>org.apache.oltu.oauth2</groupId><artifactId>org.apache.oltu.oauth2.authzserver</artifactId><version>1.0.1</version></dependency><dependency><groupId>org.apache.oltu.oauth2</groupId><artifactId>org.apache.oltu.oauth2.resourceserver</artifactId><version>1.0.1</version></dependency>备注1:⼀个程序模拟了三个服务器端,⼀个客户端。

新浪接口API调用

新浪接口API调用

新浪接口API调用新浪API2.0调用痕迹最近本人研究怎么调用新浪的接口。

一开始由于感觉时间的仓促就从网上找了个实例。

哪知道在模拟授权成功了以后进行接口的调用的时候才知道知道。

人家验证是OAuth1.0认证。

而现在新浪接口是1.0的。

老是调用的时候报Http403 五位码表示access_token无效。

这样一来我都弄疯了,连续折腾了3天,我都太折腾疯了。

总结一句话哥太心急了。

搞了半天就是找错。

问人。

折腾了半天。

没有啥人能帮上忙。

所以我就下定决心研究别人代码。

通过我晚上苦苦的研究终于弄清楚了点思路了。

第二天早上一起来灵感移动。

其实真的他妈那么简单啊。

下面我就给大家介绍我的实现思路。

当然我也借助了别人写的SDK.加以我的改变生产了dll文件。

提供后续开发这学习。

我提供下载地址。

希望能给苦命的程序员又所帮助。

尤其是像我这样的菜鸟。

老鸟当然不需要这些的。

废话都不说了。

下面就介绍下实现思路吧。

1首先我介绍下OAuth授权的内部原理:A:客户端从服务器端获取一个没有经过授权的tonken(一个32位的字符串)B:用户从客户端获取一个验证编号。

C:客户端向服务器端获取一个成功的授权编号现在也不说这些内部原理了:直接阐述代码吧。

const long clientID = 1253617897;//申|¨o请?的ì?app_key//获取程序keyconst string responseType = "authorization_code";//这个值好像可以起好多的。

集体是代表什么我还是希望别人多多参考新浪APIconst string redirectUri = "http://localhost:1978/sina/URLredirection.aspx";//回?调ì??地ì?址?¤这个回调地址是设置在新浪申请的应该平台里面的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

新浪微博OAuth授权的Java实现2011-05-24 22:21:35| 分类:java | 标签:新浪weibo oauth java sina |字号大中小订阅一、OAuth协议简介OAuth授权在各社交网站中广泛使用,该协议使用户不需要直接向第三方应用提供用户名及密码,并且使一个账户在多个网站中使用成为可能,OAuth协议的细节描述可参考其官方网站:目前OAuth 1.0已经出了final version,即RFC 5849,OAuth 2.0也已在起草中。

这篇文章中,我想用比较通俗的语言来解释OAuth协议。

OAuth协议中包含了三个角色:Service Provdier,即服务提供者,如新浪微博;User,即普通用户,如新浪微博用户;Consumer,即第三方应用,如本人开发的应用。

现有如下场景:User想利用Consumer来更新自己在Service Provider中的状态,但此时Service Provider并不信任Consumer,且User也不想把帐号和密码告诉Consumer,于是三者之间需要建立起信任关系。

Consumer首先要向Service Provider申请一对Consumer_Key和Consumer_Secret,以此取得Service Provider的信任。

因为User是信任Service Provider的,所以User与Consumer间的信任关系需要借助Service Provider来建立。

Consumer用自己的Consumer_Key和Consumer_Secret向Service Provider请求到一对Request_Token和Request_Token_Secret,而后Consumer拿上这对RequestToken,领着User 去见Service Provider。

Service Provider见到自己发的RequestToken,便确认Consumer是值得信任的,于是把头转向User。

如果Service Provider不记得User了,只要User向Service Provider提供用户名和密码,就能建立起信任关系。

然后Service Provider对User说:“我很信任这个Consumer,你是不是也要信任他?”,若User确认,则Service Provider允许Consumer 把User带回去,并发给Consumer一个V erifier.回来以后,Consumer拿着RequestToken和Verifier又单独去找Service Provider,取回来一对Access_Token和Access_Token_Secret,并长期保存。

至此,三方信任关系就建立起来了,Consumer每次在Service Provider中更新User的状态时,只需要提供这对AccessToken,Service Provider便能确定此Consumer能代替User进行相应的操作。

在使用相关OAuth库进行开发时,所需要的关键字在以上场景中都有体现,包括:Consumer_Key, Consumer_Secret, Request_Token, Request_Token_Secret, Verifier,Access_Token, Access_Token_SecretOAuth授权流程图如下:二、新浪微博开放平台OAuth授权接口新浪微博开放平台文档中声明“注意由于OAuth 1.0版有安全漏洞,我们仅支持最新的1.0a 协议”,其中OAuth 1.0a 就是目前的RFC 5849.新浪微博OAuth授权机制说明可参考:/wiki/index.php/授权机制说明为了方便使用,新浪微博提供了网页应用和桌面应用两种OAuth授权方式。

关于OAuth授权的三个接口:oauth/request_token:Consumer使用该接口向Service Provider索取RequestTokenoauth/authorize:Consumer带上RequestToken,领着User,三者再此接口见面oauth/access_token:Consumer拿着RequestToken和Verifier,在此接口向Service Provider索取AccessToken三、Java平台上的新浪微博OAuth授权新浪微博开放平台提供了一个功能强大的Java SDK,即weibo4j,下载页面:/wiki/index.php/SDK#Java_SDK此SDK改编自著名的twitter4j,封装了OAuth等其他常用的API,并包含一些示例程序。

下载weibo4j并解压,readme.txt文件内有该SDK的简要说明,其中包括了OAuth授权的示例用法。

为了更方便的体验OAuth授权,我将其中关于OAuth授权的示例提出,单独建了一个名为sinaoauth的web项目,点击下载下载sinaoauth后需修改相关内容:1、在\WEB-INF\src\weibo4j\Configuration.java文件的65和66行填上自己申请的Consumer_Key和Consumer_Secret2、若Web服务器的地址不是http://localhost:8080,则对\call.jsp文件的第9行中的url进行修改修改完成后,将sinaoauth项目复制到Web服务器的webapps下运行,在浏览器中输入:http://localhost:8080/sinaoauth/call.jsp 即可开始体验新浪微博OAuth授权。

进一步对代码进行分析,call.jsp和callback.jsp两个jsp页面负责与用户的交互,call.jsp将User带到Service Provider,而callback.jsp负责迎接从Service Provider返回的User,其中用到一个名为weboauth的JavaBean,这是OAuth授权的核心控制部分,对应的java源文件是\WEB-INF\src\weibo4j\examples\WebOAuth.javaWebOAuth类中的request方法如下,该方法对应oauth/request_token接口,接收一个callbackurl参数,即User从Service Provider授权回来后的入口,返回从Service Provider获取的RequestToken,并利用oauth/authorize接口构造授权地址。

此后,在call.jsp里将该RequestToken临时存放于session中。

public static RequestToken request(String backUrl){try{Weibo weibo = new Weibo();RequestToken requestToken =weibo.getOAuthRequestToken(backUrl);return requestToken;}catch (Exception e){return null;}}requstAccessToken方法如下,该方法对应oauth/access_token接口,接收存放在session中的RequestToken和从Service Provider带回来的Verifier,并返回从Service Provider索取的AccessToken,该AccessToken应该被持久化存储,而存放在session中的RequestToken则应失效。

public static AccessToken requstAccessToken(RequestToken requestToken, String verifier){try{Weibo weibo = new Weibo();AccessToken accessToken =weibo.getOAuthAccessToken(requestToken.getToken(),requestToken.getTokenSecret(),verifier);return accessToken;}catch (Exception e){return null;}}update方法演示了如何利用AccessToken来更新User的状态,代码浅显易懂。

public static void update(AccessToken access, String content){try{Weibo weibo = new Weibo();weibo.setToken(access.getToken(),access.getTokenSecret());Status status = weibo.updateStatus(content);}catch (WeiboException e){}}在桌面应用中,类似Web应用的网页跳转无法实现,新浪微博提供了PIN码的机制,流程与以上描述类似,但需要用户自己打开浏览器,然后将得到的PIN码输入到应用中,在sinaoauth项目里,可以直接运行\WEB-INF\src\weibo4j\examples \OAuthUpdate.java进行体验,此源文件内为一个控制台应用程序。

这篇文章从OAuth协议介绍写到新浪微博OAuth授权的Java实现,希望能起到抛砖引玉的作用,让不熟悉OAuth协议的朋友了解它,也给有意在Java平台上开发新浪微博OAuth 授权应用的朋友提供一个参考。

一直认为新浪微博的开放平台做得很有诚意,在广大开发者和网友的支持下,路一定会越走越宽。

相关文档
最新文档