展开全部

近几年来,很多网站都默默地在自己e5a48de588b662616964757a686964616f31333337376336的登录链接旁边加上了一个“用XXX平台账号登录”的链接,比如

使用第三方平台账号登录,当前平台并不会获取到用户的密码,登录的动作在第三方平台下完成。在登录完成后,会跳出一个页面,由当前平台请求对第三方平台的操作授权。

用户同意之后,一般情况下,当前平台还会要求用户注册一个在当前平台使用的独立账号。

注册成功后,下次用户再进入当前平台时,就可以使用第三方平台账号登录了。登录后,当前平台及第三方平台的账号都会进入在线状态。

OAuth 就是为了提供跨平台访问而产生的一种标准。OAuth 1.0 的标准在 2007 年发布,2.0 的标准则在 2011 年发布。其中 2.0 的标准取消了 Request token 和所有 Token 的加密过程,但因为强制使用 Https 协议,因此被认为安全性高于 1.0 的标准。

显而易见的是,第三方平台授权有非常大的优点。

首先,用户可以只使用一个社交账号来登录众多平台,这就避免了对于很多非重度使用的平台,注册后忘记用户名和密码的情况。

其次,对于一些小的平台来说,通过 OAuth 授权,可以依托大平台的账号带来用户,对于服务提供方来说,因为账号会在授权双方平台同时在线,也会为己方平台带来可观的流量。

最后,对于用户来说,简化的注册环节以及跨平台访问,则带来了相当多的便利。

OAuth 2.0流程简介

因为 1.0 标准的 OAuth 在流程中有非常多的参数传递以及程序加密步骤。如今各大平台几乎已经全部切换到了 2.0 的授权标准。

上图是 OAuth 2.0 的授权流程。(下文编号与图中编号对应)

用户在当前平台发送一个通过第三方登录的请求。

当前平台跳转到第三方平台的授权请求 URL,在 Request 中携带当前平台在第三方平台注册的应用 id, 应用 secret 以及回调地址信息。

第三方平台在确认 Request 中包含的应用 id, 应用 secret,回调地址与此前注册的一致后,给当前用户提供登录界面。

用户在第三方平台完成登录及对当前平台的授权。

>授权内容通常包括通过当前平台访问第三方平台的用户信息,以及操作第三方平台内容的权限。

第三方平台携带验证码回调当前平台。

当前平台携带验证码获取 Access token。

第三方平台验证码通过,生成 Access token 回传给当前平台。

当前平台携带 Access token 访问第三方平台的受保护内容链接。

第三方平台返回受保护的内容。

当前平台保存受保护的内容。

>通常会让用户在当前平台注册一个新账号,然后将新账号与第三方平台的账号绑定,绑定过后,用户在当前平台会成功登录。

有关 OAuth Scribe 库的使用

Scribe是一个用 Java 开发的 OAuth 开源库,支持 OAuth 1.0a / OAuth 2.0 标准。

项目地址

在 Maven 的 pom.xml 中加入库依赖:

scribe-java-mvn-repo

https://raw.github.com/fernandezpablo85/scribe-java/mvn-repo/

true

always

org.scribe

scribe

1.3.6

初始化依赖之后,就可以使用 Scribe 库了。

此外,为了从当前平台访问第三方平台,我们还需要构建服务配置类( OAuthServiceConfig )以及服务提供类( OAuthServiceProvider )。

/**

* 服务配置类,配置向第三方平台请求的服务配置项

*/

public class OAuthServiceConfig {

//以下信息在消费平台配置的与第三方平台注册的要保持完全一致

private String apiKey; //在第三方平台注册后生成的消费平台应用id

private String apiSecret;//在第三方平台注册后生成的消费平台应用secret

private String callback;//第三方平台在用户登录及授权操作通过后,消费平台的回调地址。

private String scope;//申请的权限范围,可选

private Class apiClass;//记载获取第三方校验信息api地址的类,大平台的api类多在scribe中有封装

/**

* getters & setters

*/

public OAuthServiceConfig() {

}

public OAuthServiceConfig(String apiKey, String apiSecret, String callback, String scope,

Class apiClass) {

super();

this.apiKey = apiKey;

this.apiSecret = apiSecret;

this.callback = callback;

this.apiClass = apiClass;

this.scope = scope;

}

}

/**

* 服务提供类,通过获取服务配置类中的配置,生成发送给第三方平台的Request

*/

public class OAuthServiceProvider {

private final static Logger logger = LoggerFactory.getLogger(OAuthServiceProvider.class);

private OAuthServiceConfig config;

public OAuthServiceProvider() {

}

public OAuthServiceProvider(OAuthServiceConfig config) {

this.config = config;

}

public OAuthService getService() {

return new ServiceBuilder().provider(config.getApiClass())

.apiKey(config.getApiKey())

.apiSecret(config.getApiSecret())

.callback(config.getCallback())

.scope(config.getScope())

.build();

}

}

将服务配置的参数初始化配入 Spring 配置文件。

最后是访问接口类。/callback接口为用户同意授权后,Weibo回调当前平台的接口

/**

* Controller类

*/

@Controller

public class WeiboController {

@Autowired

@Qualifier("weiboServiceProvider")

private OAuthServiceProvider weiboServiceProvider;

//获取受保护内容的地址(例如某用户信息)

private static final String PROTECTED_RESOURCE_URL = "https://api.weibo.com/2/users/show.json";

//以下代码和授权流程中的步骤编码对应

//1.接收来自客户端的第三方登录请求

@RequestMapping(value = "/oauth/weibo/login", method = RequestMethod.GET)

public String loginByWeibo() {

OAuthService service = weiboServiceProvider.getService();

//2.重定向到第三方平台的授权请求URL,其中URL已经在OauthServiceConfig类中配置

return "redirect:" + service.getAuthorizationUrl(EMPTY_TOKEN);

}

//5.携带验证码回调当前平台,code参数为验证码

@RequestMapping(value = "/oauth/weibo/callback", method = RequestMethod.GET)

public String callback(

@RequestParam(value = "code") String oauthVerifier) throws CoreException {

OAuthService service = weiboServiceProvider.getService();

Verifier verifier = new Verifier(oauthVerifier);

//6.7.携带验证码获取access token

Token accessToken = service.getAccessToken(requestToken, verifier);

OAuthRequest oauthRequest = new OAuthRequest(Verb.GET, PROTECTED_RESOURCE_URL);

//8.access token作为参数发送获取受保护内容的request

service.signRequest(accessToken, oauthRequest);

//9.第三方平台response返回受保护的内容

Response oauthResponse = oauthRequest.send();

oauthResponse.getBody();

//...处理从response获取的信息

}

}

}

本回答被提问者和网友采纳

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

java scribe_scribe-java库怎么用相关推荐

  1. 25个Java机器学习工具库

    本列表总结了25个Java机器学习工具&库: 1. Weka集成了数据挖掘工作的机器学习算法.这些算法可以直接应用于一个数据集上或者你可以自己编写代码来调用.Weka包括一系列的工具,如数据预 ...

  2. 25个Java机器学习工具库--转载

    本列表总结了25个Java机器学习工具&库: 1. Weka集成了数据挖掘工作的机器学习算法.这些算法可以直接应用于一个数据集上或者你可以自己编写代码来调用.Weka包括一系列的工具,如数据预 ...

  3. Java Streams,第 1 部分: java.util.stream 库简介

    Java SE 8 中主要的新语言特性是拉姆达表达式.可以将拉姆达表达式想作一种匿名方法:像方法一样,拉姆达 表达式具有带类型的参数.主体和返回类型.但真正的亮点不是拉姆达表达式本身,而是它们所实现的 ...

  4. java 81 08,Java更多的库谜题81:烧焦到无法识别

    下面这个程序看起来是在用一种特殊的方法做一件普通的事.那么,它会打印出什么呢? public class Greeter{ public static void main(String[] args) ...

  5. 利用JNative实现Java调用动态库

    由于项目要求,需要用Java调用windows的dll文件,查了一下,如果用JNI的话是比较麻烦的,在sourceforge.net上搜索了一下 "Java dll",首先出现的是 ...

  6. java联接pg库_Java14:使用Java 14的新记录联接数据库表

    java联接pg库 您是否知道可以使用Java 14的预览记录功能将数据库表连接到Java Stream中? 阅读这篇简短的文章,并了解如何使用Speedment Stream ORM完成它. 我们将 ...

  7. java联接pg库_成为Java流大师–第5部分:将联接的数据库表转换为流

    java联接pg库 是否可以将联接的数据库表转换为Java Stream? 答案是肯定的. 由于我们已经多次提出这个问题,因此我们决定写另一篇动手实验文章,说明如何执行更高级的Stream Joins ...

  8. JSTL(Java 标准标签库)

    文章目录 JSTL 简介 JSTL 可以使用在哪里 JSTL 使用步骤 使用标签 if 语句 选择语句 迭代遍历语句 URL重写 设置属性值 删除属性值 异常捕获 导入其它 JSP 页面 重定向 输出 ...

  9. java云题库测试使用说明 0917

    java云题库测试使用说明 0917 题目数量 50题 考试时长 150分钟

  10. java使用外部库_在Java中使用外部库

    java使用外部库 Java附带了一组核心库,其中包括定义常用数据类型和相关行为的库,例如String或Date : 与主机操作系统进行交互的实用程序,例如System或File : 有用的子系统来管 ...

最新文章

  1. 什么牌子的千兆网卡好用_男士面膜什么牌子好 10款平价好用的男士面膜推荐
  2. 大数据审计的发展_从历史的角度看大数据审计发展
  3. BZOJ-1034-[ZJOI2008]泡泡堂BNB(贪心)
  4. 技术干货 | 阿里云数据库PostgreSQL 13大版本揭秘
  5. 男人会为女人改变多少
  6. PS图像菜单下计算命令
  7. mysql二进制方式_MySQL数据库之MySql二进制连接方式详解
  8. java -xss_java 防止xss攻击
  9. 广工计算机组成原理实验报告_计算机组成原理:存储器
  10. 微博关注者数量在计算中的作用
  11. 2.Jenkins 权威指南 --- 配置Jenkins 服务器
  12. 《黑客大曝光:移动应用安全揭秘及防护措施》一3.1 了解iPhone
  13. windows系统注册dll文件
  14. pandas DataFrame方法;dataframe 定义一个数值全为1的列;dataframe创建多列;如何拆分嵌套list存为dataframe;在数据集添加一个新的列
  15. linux驱动篇-Led
  16. 视频转成gif动图怎么操作?仅需三步在线完成视频转gif
  17. 一本通1612特别行动队
  18. 阿里云创建及管理bucket(二)
  19. HDU 3105 Fred's Lotto Tickets(数学题)
  20. 从网易与淘宝的font-size思考前端设计稿与工作流

热门文章

  1. 什么是DVP?Digital Video Port
  2. 写一个可以夸人的小程序
  3. 产品与服务的商业模式探索
  4. 用户即将一分钟后关闭计算机,Win10开机提示“你的电脑将在一分钟后自动重启”怎么解决...
  5. 第一章,倒霉的少女。
  6. css sprites——CSS精灵
  7. 微信小程序开发文档和开发工具放出破解版-亲测可用
  8. SQL-结构化查询语言
  9. 问题 C: 战略威慑(树的直径)
  10. 原生态创业者,及社交想象力