php之Twitter第三方登录

1.注册微博的开发者账户

https://developer.twitter.com / en / apply / user

填写必要信息,然后等待审核

2.添加应用

创建应用是填上必要的回调地址,网站地址,以及网站的说明信息等必填信息,注意:要勾选:使用twitter登录(重要)

3.创建好应用后进入我的应用,点击键和令牌可以看到应用的密钥

4.找到官方示例:

5.详细步骤说明:

5.1获取请求令牌:

https://api.twitter.com/oauth/request_token

请求头说明参数:

  • oauth_callback,回调地址
  • oauth_consumer_key,从第三方应用程序获得的
  • oauth_signature_method,签名方法,有3种:HMAC-SHA1,RSA-SHA1,明文由于微博只支持HMAC-SHA1,故此参数值固定,为HMAC-SHA1
  •  oauth_signature,签名(此参数容易错,稍后再谈)
  • oauth_timestamp,时间戳,根据1970-1-1 0:0:0到现在所经过的秒数,如1545031519
  • oauth_nonce,随机字符串,注意,每次此参数都必须要不一样的,例如3d1sdf34
  • oauth_version,可选参数,目前版本是1.0,故值固定为1.0,但为方便扩展,最好加上

 最终以URL {参数名=参数值,&}格式发送出去,此处我给出我的发送串,参数顺序随便,但签名时有要求

成功响应参数:

成功发送后会得到返回的值未授权的组组oauth_token,oauth_token_secret(第三个只要是真就行了)

5.2重定向用户

将上一步获取到的组组组oauth_token替换到该网址后重定向

 在你的项目回调方法中处理获取到的组组组oauth_token和oauth_verifier参数

5.3将请求令牌转换为访问令牌

因为上面步骤获得的组组oauth_token和oauth_verifier是有时间限制的会过期,电子杂志这里组组oauth_tokenoauth_token_secret

用于未来对Twitter API的经过身份验证的请求

请求头:

参数还是差不多,只是少了oauth_callback;多了一个oauth_verifier和新的参数组oauth_token

响应:

将这两个值存储起来,以后获取信息,不需要用户再次输入用户名和密码,直接用最终组组oauth_token调用

例:调用home_timeline:

http://api.twitter.com/1/statuses/home_timeline.xml?oauth_consumer_key=gReNivhwQsHJ8401DYGtAw&oauth_nonce=365fd4ff32ffddffs2f&oauth_signature=MxEA2lODZ5QQh8icOL8z8f1PNOQ%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1280822863&oauth_token=169731880-OzvV2F9vWN2HwztmJi7HAvsOM78pU7Xc2dg4ZZX2&oauth_version=1.0

这里的组组oauth_token就是最终获取到的组组oauth_token

6.获取用户信息

获取https://api.twitter.com/1.1/account/verify_credentials.json

返回数据:

7.签名方法

7.1背景:推特的使用的是HMAC-SHA1方法进行签名,只有在认证的步骤中,需要签名而在使用API​​时,只要需要认证的API,都需要进行签名,方可成功调用。

7.2原理:的OAuth的认证通过用户在调用API时自行签名的结果,与API一起发送到服务器,服务器再用相同的方法进行签名,将结果与我们传过去的结果相比较,如果相同,那么签名通过,我们每次的随机串与时间戳都不一样,所以防止了重放攻击,同时这个过程中没有透露用户的账号与密码,增强了账号安全性。

7.3方法:签名需要签名串(文本)与密钥(键)

7.3.1。签名串(文本)的构成:HttpMethodurl参数。三个红色串必须用urlencode进行编码编码中的%xx符号,httpMethod中的字母必须为大写;

参数:此次请求中的除了oauth_signature以外的所有参数按照字母顺序升序排列,如果参数名相同,那么按照参数值的字母顺序升序排列。

其中列举HTTPMethod为GET / POST / PUT / DELETE等HTTP方法之一,必须全为大写,编码后仍为本身

网址为不带参数的URL,如http://api.twitter.com/1/statuses/home_timeline.xml,必须全为小写,编码后的结果为HTTP%3A%2F%2Fapi.twitter.com%2F1 %2Fstatuses%2Fhome_timeline.xml

参数即此次请求中的除了oauth_signature以外的所有参数,包括一些API所要求的参数,比如在更新自己状态时,需要状态参数。格式为按照[参数名=参数值]的格式中间用&隔开,并且要按照字母顺序升序排列,如果参数名相同,那么按照参数值的字母顺序升序排列。如

oauth_consumer_key = gReNivhwQsHJ8401DYGtAw&oauth_nonce = df563232s&oauth_signature_method = HMAC-SHA1&oauth_timestamp = 1280824014&组oauth_token = 169731880-OzvV2F9vWN2HwztmJi7HAvsOM78pU7Xc2a4sZZX2&oauth_version = 1.0

编码后为

oauth_consumer_key%3DgReNivhwQsHJ8401DYGtAw%26oauth_nonce%3Ddf563232s%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1280824014%26oauth_token%3D169731880-OzvV2F9vWN2HwztmJi7HAvsOM78pU7Xc2dg4ZZX2%26oauth_version%3D1.0

 

那么将三者再用及组合起来后,即为

GET和HTTP%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fhome_timeline.xml&

oauth_consumer_key%3DgReNivhwQsHJ8401DYGtAw%26oauth_nonce%3Ddf563232s%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1280824014%26oauth_token%3D169731880-OzvV2F9vWN2HwztmJi7HAvsOM78pU7Xc2dg4ZZX2%26oauth_version%3D1.0

注意,这个是1个字符串,上面由于缩进不够,所以换了行。这样,签名串(文本)就构造好了。

 

7.3.2密钥(键)的构成:oauth_consumer_secret&oauth_token_secret

其中

oauth_consumer_secret即从第三方应用程序获得的。

oauth_token_secret在获取时还没获得,那么即为空,但与得保留;在获取资源时,由于在获取到令牌后获得了未授权的令牌与token_secret,此时就用未授权的token_secret;当获得最终的access_token_secret后,就用获得的最终的access_token_secret,以后也永远用这个,除非重新认证。

这样,密钥(键)就构造好了。

7.4。生成签名 - 签名也要用url encode进行编码

自己用程序实现HMAC-SHA1的加密签名算法。下面给个利用上面的文本/键结果,用HMAC-SHA1算法生成的签名,你也可以通过这个来判断自己的算法正不正确。

文本:

GET和HTTP%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fhome_timeline.xml&

oauth_consumer_key%3DgReNivhwQsHJ8401DYGtAw%26oauth_nonce%3Ddf563232s%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1280824014%26oauth_token%3D169731880-OzvV2F9vWN2HwztmJi7HAvsOM78pU7Xc2dg4ZZX2%26oauth_version%3D1.0

键:

gReNivhwQsHJ8401DYGtAw&0BQFkAcOqYGNgbt0NwoF7w3G9MUlt9AkSJBIwkxoFA

生成的签名:

ITtbuTI901ie4bCFg5vGfb1mCxM =

最后,生成的签名也要用url encode进行编码,编码后的结果为

ITtbuTI901ie4bCFg5vGfb1mCxM%3D

此时再将此字串填充到要发送的HTTP请求中即可。
 


参考:https://blog.csdn.net/yangjian8915/article/details/11816669 
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值