OAuth 2.0 - Authorization Code授权方式详解

I:OAuth 2.0 开发前期准备

天上不会自然掉馅饼让你轻松地去访问到人家资源服务器里面的用户数据资源,所以你需要做的前期开发准备工作就是把AppKey, AppSecret取到手 新浪获取传送门,腾讯获取传送门

这里说一下,在申请AppKey和AppSecret的过程中,新浪和腾讯的申请做法是有区别的。image
在新浪微博的AppKey,AppSecret申请时会验证你是否拥有域名的所有权


image
而腾讯在这一块上面则没有这个要求!

PS:申请成为开放平台开发者时需要上传身份证电子文件。。。。。

II:为什么不用官方提供的SDK

说到这个我就想吐槽了,这官方的SDK尼玛的明显排斥堆挤咋们做.net的啊!~~~
先上新浪支持的SDK:
image


然后在上腾讯支持的SDK:
image
image

文档资料不全不说,出了问题你还得找人家。所以在这里我也试想过转战JS SDK看看~于是又有了如下的悲剧事情发生:

腾讯和新浪的JS SDK都是主推用js弹窗方面的。这样不太会电脑的用户使用起来的话,就会觉得你的这个第三方应用会不会是病毒神马的。
image IE9下弹窗提示


image Chrome下也会提示,所以这个东西是浏览器本身机制的问题~所以在帖子里面也得到了准确的答复。


image 稍微设置一下允许弹窗的话就得到上面这个怪异摸样。。。


而在这里稍微说一下腾讯的OPENJS这个东西!!我个人感觉它想挑战一下我们开发人员的智商。。。
image这个为什么浏览器没有阻止,完全是在同域的情况下啊~~~TX你这互联老大连另外整个类似于新浪的独立域名的工作都没做好啊!!还在自家的API文档站上高亮标示起这个OpenJS新秀呀。
image 

不过相比新浪的JS SDK腾讯自家的OpenJS的技术支持做得非常好的。你只要碰到了问题。都有人在线帮你解答。

PS:如果你选用JS SDK的话,那么你的业务逻辑将会以js脚本的形式暴露在客户端浏览器之下。

III:Authorization Code验证授权模式

基础知识:
在这里先引用前一篇文章里的示例用图,然后再接着讲解各个部分的相关知识。

1.Resource Server(资源服务器):负责存放服务提供商的用户数据资源等相关信息。当第三方应用访问这个资源服务器时,需要提供Access Token否则会提示访问失败。所以我们最终的目的就是让自己开发的第三方Web应用顺利地访问到服务提供商的资源服务器,这才是这个系列文章的最终目的。

2.Authorization Server(验证授权服务器):负责验证用户账户名密码,以及给第三方WEB应用发放Access Token。在这里我上传两张图片为你叙述Authorization Server是什么样子。
image 新浪的Authorization Server


image
腾讯的Authorization Server

接下来将会继续讲解,这个重要的Access Token(访问令牌)到底是怎么取得的。

首先作为第三方网站上会显示一个跳转到新浪,腾讯授权服务器的<a />超级链接。如下图:
image


下面的图片将介绍这两个链接的跳转地址规范:
image

新浪的规范
https://api.weibo.com/oauth2/authorize?client_id={AppKey}&response_type=code&redirect_uri={YourSiteUrl}


腾讯的规范
https://open.t.qq.com/cgi-bin/oauth2/authorize?client_id={AppKey}&response_type=code&redirect_uri={YourSiteUrl}

可以看出新浪和腾讯的规范在此步骤基本一致。

现在讲述第2步:image


这时Authorization Server将会跳转回申请授权验证的第三方网站~但是会在QueryString内加上一个名为code的参数!例子如下:

腾讯:http://www.mytestsite.com/Tencent.aspx?code=174256357036c9df7db17342f15a9476&openid=45CD8A7A05A0C3E30D8A9AB74EEAA8D1&openkey=98B2964245A2BE2830F7A793E09FE6B0


新浪:http://www.mytestsite.com/Sina.aspx?code=19b83321705c538e0422ba09ac9043a0

从这一步可以看出企鹅与标准脱离的野心逐渐浮现。。。它不仅仅返回code而且还参杂openid&openkey~不知在各位开发者的眼里会不会觉得比较另类?

当我们拿到跳转回来Url上的QueryString参数code后就可以再次去Authorization Server上请求获取AccessToken这个重要令牌了!下面接着上图!!!
image

具体说一下第3步的请求地址规范:
新浪:https://api.weibo.com/oauth2/access_token?client_id={AppKey}&client_secret={AppSecret}&grant_type=authorization_code&redirect_uri={YourSiteUrl}&code={code}


腾讯:https://open.t.qq.com/cgi-bin/oauth2/access_token?client_id={AppKey}&client_secret={AppSecret}&redirect_uri={YourSiteUrl}&grant_type=authorization_code&code={code}

在这一步,腾讯和新浪双方都完全保持一致,非常庆幸!

第4步,重点来了,授权服务器即将返回Access Token。这是以Response Body的方式,所以说Authorization Code授权方式并没有对客户端暴露AccessToken访问令牌。也是我极力推荐使用的一种授权方式。
image
image
上图是新浪返回Access Token的内容


image
image
上图是腾讯返回Access Token的内容

这里需要注意一下第3,4步必须要以http post的方式去发起Request。~

IV:总结

image

下一篇将会讲解如何访问资源服务器!尽请期待吧!

本文到此结束!谢谢。

广告:OAuth2.0 组件讨论群:108441512 询问C#以外的OAuth 2.0 sdk同学勿入!谢谢合作。

转载于:https://www.cnblogs.com/highend/archive/2012/07/06/oautn2_authorization_code.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本)

一、spring cloud简介 鉴于《史上最简单的Spring Cloud教程》很受读者欢迎&#xff0c;再次我特意升级了一下版本&#xff0c;目前支持的版本为Spring Boot版本2.0.3.RELEASE,Spring Cloud版本为Finchley.RELEASE。 Finchley版本的官方文档如下&#xff1a; http://cloud.spri…

最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)(Finchley版本)

在上一篇文章&#xff0c;讲了服务的注册和发现。在微服务架构中&#xff0c;业务都会被拆分成一个独立的服务&#xff0c;服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式&#xff0c;一种是ribbonrestTemplate&#xff0c;另一种是feign。在这一篇文章…

链表选择排序算法功能实现演示

算法: 狭义的算法是与数据的存数方式密切相关 广义的算法是与数据的存储方式无关 泛型: 利用某种技术达到的效果就是:不同的存数方式&#xff0c;执行的操作是一样的 #include <stdio.h> #include <malloc.h> #include <string.h> #include <stdlib.h&g…

链表插入功能实现演示

#include <stdio.h> #include <malloc.h> #include <string.h> #include <stdlib.h>typedef struct Node {int data; //数据域struct Node * pNext; //指针域}Node, *pNode;//函数声明 pNode create_list(); void traverse_list(pNode pHead); …

【.NET程序性能分析】使用VS自带的工具分析.NET程序的性能

这篇博文给大家分享的是&#xff0c;如何使用VS自带的性能分析工具来分析我们编写的.NET程序&#xff0c;一边找出程序性能的瓶颈&#xff0c;改善代码的质量。在实际开发中&#xff0c;性能真的很重要&#xff0c;往往决定一个产品的生死~良好的用户体验的基础之一也是程序要有…

链表删除功能实现演示

插入算法和删除演示&#xff1a; #include <stdio.h> #include <malloc.h> #include <string.h> #include <stdlib.h>typedef struct Node {int data; //数据域struct Node * pNext; //指针域}Node, *pNode;//函数声明 pNode create_list(); void …

栈入门

线性结构的两种常见应用之一栈 定义&#xff1a;一种可以实现”先进后出”的存储结构&#xff0c;栈类似于箱子 分类&#xff1a;静态栈、动态栈 算法&#xff1a;出栈、压栈 栈的定义&#xff1a; 栈&#xff08;stack&#xff09;又名堆栈&#xff0c;它是一种运算受限的线性…

Packet Tracer 5.0实验(四) 利用三层交换机实现VLAN间路由

一、实验目标 掌握交换机Tag VLAN 的配置&#xff1b;掌握三层交换机基本配置方法&#xff1b;掌握三层交换机VLAN路由的配置方法&#xff1b;通过三层交换机实现VLAN间相互通信&#xff1b;二、实验背景 某企业有两个主要部门&#xff0c;技术部和销售部&#xff0c;分处于不同…

栈程序演示

#include <stdio.h> #include <malloc.h> #include <stdlib.h>typedef struct Node{int data;struct Node * pNext; }NODE,*PNODE;typedef struct Stack{PNODE pTop; //栈顶元素PNODE pBottom; //栈底部元素 }STACK,*PSTACK;void init(PSTACK); v…

noi 2009 二叉查找树 动态规划

思路&#xff1a; 先把权值离散化 按数据值排序 sum[i]为前i个节点频度和 dp[i][j][w]表示把节点[i,j]合并成一颗根节点权值不小于w的子树所需的访问代价与修改代价的最小和 dp[i][j][w]min(dp[i][k-1][w]dp[k1][j][w]sum[j]-sum[i-1]K,dp[i][k-1][a[k].weight]dp[k1][j][a[k].…

出栈程序演示

#include <stdio.h> #include <malloc.h> #include <stdlib.h>typedef struct Node{int data;struct Node * pNext; }NODE,*PNODE;typedef struct Stack{PNODE pTop; //栈顶元素PNODE pBottom; //栈底部元素 }STACK,*PSTACK;void init(PSTACK); v…

栈清空程序演示

#include <stdio.h> #include <malloc.h> #include <stdlib.h>typedef struct Node{int data;struct Node * pNext; }NODE,*PNODE;typedef struct Stack{PNODE pTop; //栈顶元素PNODE pBottom; //栈底部元素 }STACK,*PSTACK;void init(PSTACK); v…

MySQL学习笔记——显示数据库信息

show privileges 显示可用的系统权限清单。   View Code mysql> show privileges;-----------------------------------------------------------------------------------------------------------------------| Privilege | Context …

队列入门简介

线性结构的两种常见应用之二队列 定义:种可以实现“先进先出”的存储结构 分类:链式队列(链表实现)、静态队列(数组实现) 队列&#xff08;常用数据结构之一&#xff09; 队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端&#xff08;front&#xff09;进行…

静态队列

静态队列- --用数组实现 静态队列通常都必须是循环队列 循环队列的讲解: 1.静态队列为什么必须是循环队列&#xff1f; 数组表示的问题  对于队列最好的方法是使用链表实现&#xff0c;因为对于数组来说&#xff0c;队列可能会出现下面这种情况&#xff1a; 如图所示&#…

链表队列入门介绍

1&#xff0c;快速开始&#xff1a; 队列是一种和栈相反的&#xff0c;遵循先进先出原则的线性表。此文章使用链表来实现队列。 如上图所示&#xff0c;就像一个自来水管&#xff0c;先进入水管的水先从水龙头出来&#xff0c;即Front位置的元素最先出队列&#xff0c;因为它们…

链表队列初始化

队列初始化 初始化主要是对为队列中的两个重要节点分配空间&#xff0c;这里我们需要注意的是初始化时头指针和尾指针指向同一个节点。 代码如下&#xff1a; status initQueue(LinkQueue* que) { //初始化队列que->headque->rear(QueuePtr)malloc(sizeof(QNode));if(…

链表队列入队算法

循环队列入队伪算法讲解 两步完成: 1.将值存入r所代表的位置 2.错误的写法rr1; 正确的写法是:r(r1)%数组的长度 入队操作 一定要搞清指针的概念。 首先rear和head指向同一个元素。然后&#xff0c;我们使rear的next指向新元素&#xff0c;这样rear指向的元素&#xff08;即1&am…

链表队列出队算法

出队操作 我们来思考这个过程&#xff0c;在下图队列中&#xff0c;我们出队的第一个元素是元素A&#xff0c;不是1。&#xff08;因为1不是插入进来了的&#xff0c;而是我们初始化时就有的&#xff09;。我们首先让*t等于head的next&#xff0c;即元素A。然后修改head的next指…

数据库优化 - MYSQL优化

判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断&#xff1a; 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长 应用的日志出现超时等错误 可以使用sar命令&#xff0c;top命令查看当前系统状态。 也可以通过Prometheus、Grafana等监控工具观察系统状态。&a…