Twitter第三方登录接入方案

概述

Twitter使用3-legged方式获取Access Token,3-legged包含三个角色:Consumer(消费方,app)、Service Provider(服务提供者,Twitter)、User(用户)
针对上面三个角色鉴权流程分为三步:

  1. 消费方请求Request Token
  2. 让用户进行身份验证,并向消费者应用程序发送Request Token
  3. 消费方用Request Token请求服务提供者获取Access Token

Oauth鉴权流程

在这里插入图片描述

Twitter 鉴权实现

在这里插入图片描述

Step 1: POST oauth/request_token

消费者应用请求以Twitter获取Request Token
返回:

oauth_token=OAUTH_TOKEN
oauth_token_secret=OAUTH_TOKEN_SECRET
oauth_callback_confirmed=true

Step 2: GET oauth/authorize

让用户进行身份验证,并向消费者应用程序发送Request Token
将用户重定向到的示例 URL:

https://api.twitter.com/oauth/authorize?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0

身份验证成功后,您将收到包含和参数callback_url的请求。应用程序应验证令牌是否与步骤 1 中收到的请求令牌相匹配。oauth_tokenoauth_verifier
来自客户端重定向的请求:

https://yourCallbackUrl.com?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0&oauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY

Step 3: POST oauth/access_token

消费方用Request Token请求Twitter获取Access Token
请求案例

POST /oauth/access_token
oauth_consumer_key=cChZNFj6T5R0TigYB9yd1w
oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0
oauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY

返回值

oauth_token=7588892-kagSNqWge8gB1WwE3plnFsJHAZVfxWD7Vb57p0b4
oauth_token_secret=PbKfYqSryyeKDWz4ebtY3o5ogNLG11WJuZBc9fQrQo

Step 4: GET account/verify_credentials
服务端在调用Twitter API 时需要使用oauth_token、oauth_token_secret 进行身份认证;
请求案例

POST /oauth/access_token
oauth_consumer_key=cChZNFj6T5R0TigYB9yd1w
oauth_consumer_secret=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0
oauth_token=7588892-kagSNqWge8gB1WwE3plnFsJHAZVfxWD7Vb57p0b4
oauth_token_secret=PbKfYqSryyeKDWz4ebtY3o5ogNLG11WJuZBc9fQrQo

返回值:

Uid
userName

Twitter 权限认证服务端实现

使用Twitter4j接入Twitter API
https://github.com/Twitter4J/Twitter4J

<dependency>
    <groupId>org.twitter4j</groupId>
    <artifactId>twitter4j-core</artifactId>
    <version>4.0.7</version>
</dependency>

Twitter凭证校验

public User verifyCredentials(String accessToken, String accessTokenSecret) {
    ConfigurationBuilder builder = new ConfigurationBuilder();
    builder.setOAuthConsumerKey("CONSUMER-KEY");
    builder.setOAuthConsumerSecret("CONSUMER-SECRET");
    builder.setOAuthAccessToken(accessToken);
    builder.setOAuthAccessTokenSecret(accessTokenSecret);
    builder.setDebugEnabled(true);
    Twitter twitter = new TwitterFactory(builder.build()).getInstance();
    User user = null;
    try {
        user = twitter.users().verifyCredentials();
    } catch (TwitterException e) {
        LOGGER.error("credentials verify error.accessToken={},accessTokenSecret={}", accessToken, accessTokenSecret,
                e);
        throw new GhException(AthenaErrorEnum.BAD_REQUEST, e);
    }
    return user;
}

Twitter 术语

在Twitter开发者文档中不同术语含义是一样的。

1.客户端凭证
App Key == API Key == Consumer API Key == Consumer Key == Customer Key == oauth_consumer_key
App Key Secret == API Secret Key == Consumer Secret == Consumer Key == Customer Key == oauth_consumer_secret
Callback URL == oauth_callback

2.临时凭证
Request Token == oauth_token
Request Token Secret == oauth_token_secret
oauth_verifier

3.Token 凭证
Access token == Token == resulting oauth_token
Access token secret == Token Secret == resulting oauth_token_secret

Twitter官方文档
https://developer.twitter.com/en/docs/authentication/oauth-2-0/authorization-code
https://developer.twitter.com/en/docs/authentication/oauth-1-0a/obtaining-user-access-tokens

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需将其暴露给客户端。工厂模式可以帮助我们封装对象的创建过程,使代码更加灵活和可维护。 对于第三方登录,我们可以使用工厂模式进行封装。具体实现如下: 1. 定义一个接口或抽象类,用于表示第三方登录的功能。 ```java public interface ThirdPartyLogin { void login(); } ``` 2. 创建具体的第三方登录类,实现接口或抽象类中的方法。 ```java public class FacebookLogin implements ThirdPartyLogin { @Override public void login() { // 实现 Facebook 登录功能 } } public class TwitterLogin implements ThirdPartyLogin { @Override public void login() { // 实现 Twitter 登录功能 } } public class GoogleLogin implements ThirdPartyLogin { @Override public void login() { // 实现 Google 登录功能 } } ``` 3. 创建工厂类,用于实例化具体的第三方登录类。 ```java public class ThirdPartyLoginFactory { public ThirdPartyLogin createLogin(String type) { switch (type) { case "Facebook": return new FacebookLogin(); case "Twitter": return new TwitterLogin(); case "Google": return new GoogleLogin(); default: throw new IllegalArgumentException("Invalid login type: " + type); } } } ``` 4. 在客户端中使用工厂类创建第三方登录对象。 ```java public class Client { public static void main(String[] args) { ThirdPartyLoginFactory factory = new ThirdPartyLoginFactory(); ThirdPartyLogin login1 = factory.createLogin("Facebook"); login1.login(); ThirdPartyLogin login2 = factory.createLogin("Twitter"); login2.login(); ThirdPartyLogin login3 = factory.createLogin("Google"); login3.login(); } } ``` 使用工厂模式对第三方登录进行封装,可以使代码更加简洁、灵活和可维护。客户端只需要知道工厂类和接口或抽象类,无需知道具体的实现细节。如果需要添加新的第三方登录功能,只需要创建新的具体类并在工厂类中添加相应的逻辑即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值