第一步
先申请twitter开发者账号,创建App,我这里没有创建app,当时好像是默认有一个app,twitter官方说,创建一个app需要先删除一个app,我是没有充钱的,不知道充钱和免费使用接口的是不是一样的。第二步
在生成CustomerKey以及CustomeSecret,我之后会用到这两个,这写密钥一生成永久有效,除非又重新生成了,在生成的时候有一次复制的机会,关闭了得重新生成才能复制了。下面的两个token可以不用生成,因为没有用到。第三步
Settings填写回调地址(这个回调地址,据我的试错来讲,是服务器地址--就是后端那边的地址),以及填写网站地址。其中这callback URL一定是https开头的,而且不能localhost或者127.0.0.1,一定要是有效域名+你后端在@RequestMapping写的路径,例如https://baidu.com/callback 第二个地址,我不知道有什么用,我就填了前端绑定的域名,例如:https://baidu.com,这个地址不要填到具体的路由跳转路径
第四步
前端代码
这部分代码很简单只有一个按钮去访问后端的地址。点击查看代码
<template>
<div class="otherSign">
<div class="twitter" @click="twitter">
<img src="/public/appImg/X.png" />
</div>
</template>
点击查看代码
<script setup>
const twitter = async () => {
const response = await twitterAPI();
if (response.code === 200) {
window.open(response.data.authUrl, "_blank");
}
}
</script>
点击查看代码
export const twitterAPI = () => {
return request({
url: "/twitter/backend/twitter-login",
method: "GET"
})
}
后端代码
这个代码是前端的请求,会触发的代码,我直接写在了Controller层,因为之前写了好多天,很烦,干脆直接把逻辑写在Controller层导入依赖
点击查看代码
<!--twitter鉴权包-->
<dependency>
<groupId>org.twitter4j</groupId>
<artifactId>twitter4j-core</artifactId>
<version>4.0.7</version>
</dependency>
Controller代码
点击查看代码
//关于推特应该要用到的类/接口
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
import twitter4j.conf.ConfigurationBuilder;
@Autowired
private TwitterLogin twitterLogin;
private static final String CONSUMER_KEY = "your CONSUMER_KEY "; //前面生成的
private static final String CONSUMER_SECRET = "your CONSUMER_SECRET";//前面生成的
private static final String CALLBACK_URL = "https://baidu.com/callback";//这里是回调函数,baidu.com只是个例子,要填自己的,注意,一定是https开头,就是有SSL证书
//创建推特对象 其实我这里代码冗余了
private Twitter createTwitterInstance(){
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey(CONSUMER_KEY)
.setOAuthConsumerSecret(CONSUMER_SECRET)
.setIncludeEmailEnabled(true);
TwitterFactory tf = new TwitterFactory(cb.build());
return tf.getInstance();
}
//这一步是我们自己前端触发的,主要是调起twitter登录接口,要开启合理上网工具才能跳转twitter登录页的,不然会没有反应。
@RequestMapping("/twitter/backend/twitter-login")
//public Map<String,String> twitterLogin(){
public Result twitterLogin(){
TwitterFactory factory = new TwitterFactory();
Twitter twitter = factory.getInstance();
twitter.setOAuthConsumer(CONSUMER_KEY,CONSUMER_SECRET);
try {
RequestToken requestToken = twitter.getOAuthRequestToken(CALLBACK_URL);
String authUrl = requestToken.getAuthenticationURL();
Map<String,String> response = new HashMap<>();
response.put("authUrl",authUrl);
return Result.success(response, ResultCodeEnum.SUCCESS);
} catch (TwitterException e) {
e.printStackTrace();
return Result.error(Collections.emptyMap(),ResultCodeEnum.DATA_ERROR);
}
}
点击查看代码
@GetMapping("/twitter/backend/callback")
public void twitterCallback(@RequestParam("oauth_token") String oauthToken,
@RequestParam("oauth_verifier") String oauthVerifier,
HttpServletResponse response) throws IOException {
// 根据oauthToken oauthVerifier调用Twitter API 获取访问令牌
//处理访问令牌,存储在后端或者返回给前端
/* System.out.println("oauthToken:"+oauthToken);
System.out.println("oauthVerifier:"+oauthVerifier); */
Twitter twitter = createTwitterInstance();
AccessToken accessToken = null;
try {
accessToken = twitter.getOAuthAccessToken(
new RequestToken(oauthToken,""),oauthVerifier);
//获取访问令牌和密钥
String token = accessToken.getToken();
String secret = accessToken.getTokenSecret();
//使用访问令牌和密钥创建推特对象
Twitter twitterWithToken = createTwitterInstance();
twitterWithToken.setOAuthAccessToken(new AccessToken(token,secret));
//获取当前用户信息
User user = twitterWithToken.verifyCredentials();
String userName = user.getName();
String screenName = user.getScreenName();
//这个接口不能获取到email
// String email = user.getEmail();
String id = String.valueOf(user.getId());
System.out.println("userName:"+userName);
System.out.println("screenName:"+screenName);
// System.out.println("email:"+email);
System.out.println("id:"+id);
//插入/或不插入数据库
Result rs = twitterLogin.saveInfo(userName, screenName);
Object data = rs.getData();
// String url = "https://前端域名/twitterDue?result="+URLEncoder.encode(rs,"UTF-8");
String jsonString = JSON.toJSONString(data);
String url = "https://前端域名/twitterDue?result="+jsonString;
response.sendRedirect(url);
} catch (TwitterException e) {
throw new RuntimeException(e);
}
}
官网还有关于这三步更详细的解说,我这里用到的是twitter使用 OAuth1.0做第三方授权的 API。这里三个步骤,1、2个步骤写在了第一个请求那里,第3个步骤写在了回调里面,总的来说,三个步骤,两个请求就够了。我的前端是vue3。
标签:Vue,Springboot,twitter,OAuth1.0,Twitter,twitter4j,CONSUMER,代码,String From: https://www.cnblogs.com/ozq2020/p/18010251