OAuth 2.0简单实战(以新浪开发平台为例)

ios小项目——新浪微博客户端总结 这个demo很多人下载后说有错误 运行不了什么的 但是又不贴出错误 我怎么知道你哪里出了问题 有很多人都会自己动手去掉错误 为什么有些人就只会在那里说运行不了 这个demo只是一个入门的小练习而已 主要的还是看懂代码在写什么 不是纠结于看不到运行结果 如果还有朋友下载了我的源码后 运行不了 我希望你来这里留言 和我说到底是什么错误 在资源区 我没办法回复 再次谢谢大家的支持. 很多朋友下载完源码 阅读详情

背景

本人去年在UCLA打酱油的时候曾经要求抓过新浪微博的有关数据。然而要读写这些微博信息和朋友关系,必须要在新浪围脖平台上注册应用。也就是要接触 OAuth 2.0 这个东西。当时基本不懂,今天看到了阮一峰博客上的这篇文章,决定自己动手一试。

准备

首先,你要把阮一峰博客上的这篇文章 粗略的读一遍。

然后你要上 新浪开发平台 注册一个应用,我注册的是微连接 - 网页应用

enter image description here

打开界面你可以看到App Key和App Secret,这是要用的东西

好,接下来下载新浪微博python SDK,我们用Python进行分析

分析

首先,我们先根据微博API上面的HOW-TO 文档上来做

from weibo import APIClient

APP_KEY = '1234567' # app key
APP_SECRET = 'abcdefghijklmn' # app secret
CALLBACK_URL = 'http://www.example.com/callback' 
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
url = client.get_authorize_url()

这样就拿到了URL了,你打开这个URL一看,正是提示你要授权应用(出现error:redirect_uri_mismatch 同学请到新浪微博开发界面填好redirect_uri)

好,我们看看源码

class APIClient(object):
    '''
    API client using synchronized invocation.
    '''
    def __init__(self, app_key, app_secret, redirect_uri=None, response_type='code', domain='api.weibo.com', version='2'):
        self.client_id = str(app_key)
        self.client_secret = str(app_secret)
        self.redirect_uri = redirect_uri
        self.response_type = response_type
        self.auth_url = 'https://%s/oauth2/' % domain
        self.api_url = 'https://%s/%s/' % (domain, version)
        self.access_token = None
        self.expires = 0.0
        self.get = HttpObject(self, _HTTP_GET)
        self.post = HttpObject(self, _HTTP_POST)
        self.upload = HttpObject(self, _HTTP_UPLOAD)

    def get_authorize_url(self, redirect_uri=None, **kw):
        '''
        return the authorization url that the user should be redirected to.
        '''
        redirect = redirect_uri if redirect_uri else self.redirect_uri
        if not redirect:
            raise APIError('21305', 'Parameter absent: redirect_uri', 'OAuth2 request')
        response_type = kw.pop('response_type', 'code')
        return '%s%s?%s' % (self.auth_url, 'authorize', \
                _encode_params(client_id = self.client_id, \
                        response_type = response_type, \
                        redirect_uri = redirect, **kw))

client_id,redirect_url,app_key,好熟悉啊,仔细一看,原来是授权码模式的第一步

The client constructs the request URI by adding the following
parameters to the query component of the authorization endpoint URI
using the "application/x-www-form-urlencoded" format, per Appendix B:

response_type
REQUIRED. Value MUST be set to "code".

client_id
REQUIRED. The client identifier as described in Section 2.2.

redirect_uri
OPTIONAL. As described in Section 3.1.2.

scope
OPTIONAL. The scope of the access request as described by
Section 3.3.

state
RECOMMENDED. An opaque value used by the client to maintain
state between the request and callback. The authorization
server includes this value when redirecting the user-agent back
to the client. The parameter SHOULD be used for preventing
cross-site request forgery as described in Section 10.12.

好了,当我们把账号密码填写好了之后验证成功后,你发现你的浏览器上面的URL发生了变化,到底是这么回事呢,请看第二步Authorization Response

If the resource owner grants the access request, the authorization
server issues an authorization code and delivers it to the client by
adding the following parameters to the query component of the
redirection URI using the "application/x-www-form-urlencoded" format,
per Appendix B:

code
REQUIRED. The authorization code generated by the
authorization server. The authorization code MUST expire
shortly after it is issued to mitigate the risk of leaks. A
maximum authorization code lifetime of 10 minutes is
RECOMMENDED. The client MUST NOT use the authorization code more than once. If an authorization code is used more than
once, the authorization server MUST deny the request and SHOULD
revoke (when possible) all tokens previously issued based on
that authorization code. The authorization code is bound to
the client identifier and redirection URI.

state
REQUIRED if the "state" parameter was present in the client
authorization request. The exact value received from the
client.

For example, the authorization server redirects the user-agent by
sending the following HTTP response:

 HTTP/1.1 302 Found
 Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
           &state=xyz

然后我们继续按照API的指示做

# 获取URL参数code:
code = your.web.framework.request.get('code')
r = client.request_access_token(code)

def request_access_token(self, code, redirect_uri=None):
        redirect = redirect_uri if redirect_uri else self.redirect_uri
        if not redirect:
            raise APIError('21305', 'Parameter absent: redirect_uri', 'OAuth2 request')
        r = _http_post('%s%s' % (self.auth_url, 'access_token'), \
                client_id = self.client_id, \
                client_secret = self.client_secret, \
                redirect_uri = redirect, \
                code = code, grant_type = 'authorization_code')
        return self._parse_access_token(r)

这个获得code 方法通常可以有很多,但是我们既然是实验,就手动复制code 吧。

哈哈,很明显request_access_token 这个方法就是发一个HTTP POST 包嘛

第三步Access Token Request

The client makes a request to the token endpoint by sending the
following parameters using the "application/x-www-form-urlencoded"
format per Appendix B with a character encoding of UTF-8 in the HTTP
request entity-body:

grant_type
REQUIRED. Value MUST be set to "authorization_code".

code
REQUIRED. The authorization code received from the
authorization server.

redirect_uri
REQUIRED, if the "redirect_uri" parameter was included in the
authorization request as described in Section 4.1.1, and their
values MUST be identical.

client_id
REQUIRED, if the client is not authenticating with the
authorization server as described in Section 3.2.1.

If the client type is confidential or the client was issued client
credentials (or assigned other authentication requirements), the
client MUST authenticate with the authorization server as described
in Section 3.2.1.

For example, the client makes the following HTTP request using TLS
(with extra line breaks for display purposes only):

 POST /token HTTP/1.1
 Host: server.example.com
 Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
 Content-Type: application/x-www-form-urlencoded

 grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
 &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

最后一步

access_token = r.access_token # 新浪返回的token,类似abc123xyz456
expires_in = r.expires_in # token过期的UNIX时间:http://zh.wikipedia.org/wiki/UNIX%E6%97%B6%E9%97%B4
# TODO: 在此可保存access token
client.set_access_token(access_token, expires_in)

就是从服务器返回的HTTP 包中解析access_token 和 expire_in 数据

同样来看RFC 文档中写的

If the access token request is valid and authorized, the
authorization server issues an access token and optional refresh
token as described in Section 5.1. If the request client
authentication failed or is invalid, the authorization server returns
an error response as described in Section 5.2.

An example successful response:

 HTTP/1.1 200 OK
 Content-Type: application/json;charset=UTF-8
 Cache-Control: no-store
 Pragma: no-cache

 {
   "access_token":"2YotnFZFEjr1zCsicMWpAA",
   "token_type":"example",
   "expires_in":3600,
   "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
   "example_parameter":"example_value"
 }

接下来就可以调用API啦~

对于最后两步看的很累的话,可以自己尝试写一个

import urllib, urllib2

APP_KEY = '2613134348'
APP_SECRET = '5a14f41598a7444c7e0dc0422519b091' # app secret
ACCESS_TOKEN = '9cd1b3869e62491331caf444456953e8'
data = {
        'grant_type' : 'authorization_code', 
        'code' :ACCESS_TOKEN, 
        'redirect_uri':'http://www.ceclinux.org',
        'client_id':APP_KEY,
        'client_secret':APP_SECRET   
        }
headers = {'host':'api.weibo.com','Authorization':'OAuth2 %s' % ACCESS_TOKEN}
data = urllib.urlencode(data)
request = urllib2.Request('https://api.weibo.com/oauth2/access_token', data, headers)
response = urllib2.urlopen(request)
print response.read()

运行这个文件
最后也能得到一个包含access_token和expire_date的JSON文件

没了~

参考

  • http://github.liaoxuefeng.com/sinaweibopy/
  • https://github.com/michaelliao/sinaweibopy/wiki/OAuth2-HOWTO
  • http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
android 新浪微博Oauth2.0认证以及自定义webview认证 首先不得不说,自己犯了一个比较窝囊的错误,不过也不能完全怪我,因为大家都知道,新浪微博Oauth2.0提供的jar包,好家伙2M多,谁看谁都不想用,才使得我去研究1.0的使用,研究好久,终于实现可用了,变态的新浪最新说要停止1.0接口的调用,害的我不得不更改了,想想也是,人家升级就是为了好用嘛。好了不抱怨了,因为新浪Oauth2.0比1.0方便多了,也好用多了,在这里我简单说明一下: 阅读详情

相关推荐

新浪微博Oauth2.0授权 获取Access Token以及API的使用

今天需要使用新浪微博提供的API获取微博的详细信息以及用户的详细信息,所以需要使用API中的/statuses/show接口。 使用新浪微博API的前提是需要到新浪微博开放平台注册一个应用,获得App Key和App Secret,然后再根据这两个获取Access Token。下面详细介绍如何获取Access Token以及如何使用新浪微博提供的API。 一、获取Access Token 1

Eliot 2万+

新浪开放平台---oauth2认证流程 casperjs自动登录和授权 api需要注意的问题及bug

官网 http://open.weibo.com/ API http://open.weibo.com/wiki/API%E6%96%87%E6%A1%A3_V2 SDK http://open.weibo.com/wiki/SDK 商业API http://open.weibo.com/wiki/Business_API%E6%96%87%E6%A1%A3 一、OAuth认证

鸟窝 7610

Oauth2认证以及新浪微博开放平台应用

一、OAuth2.0概述 大部分API的访问如发表微博、获取私信,关注都需要用户身份,目前新浪微博开放平台用户身份鉴权有OAuth2.0和Basic Auth(仅用于应用所属开发者调试接口),新版接口也仅支持这两种方式。OAuth2.0较1.0相比整个授权验证流程更简单更安全,也是未来最主要的用户身份验证和授权方式。 关于OAuth2.0协议授权流程查看OAuth2.0授权流程 ,其中Clie

XJAVASunjava的专栏 6382

java 的新浪oauth_新浪微博OAuth授权的Java实现

一、OAuth协议简介OAuth授权在各社交网站中广泛使用,该协议使用户不需要直接向第三方应用提供用户名及密码,并且使一个账户在多个网站中使用成为可能,OAuth协议的细节描述可参考其官方网站:http://oauth.net目前OAuth 1.0已经出了final version,即RFC 5849,OAuth 2.0也已在起草中。这篇文章中,我想用比较通俗的语言来解释OAuth协议。OAuth...

weixin_34828705的博客 444

OAuth2.in.Action.2017.3.pdf

OAuth2.in.Action.2017.3.pdf

簡單易懂的 OAuth 2.0

利用 OAuth 2 通訊協定,可以實作出 API 的存取管制,讓 API 得知要操作的對象 user 是誰,並且讓你做出像 Facebook 登入那樣子的登入流程。然而 OAuth 2.0 的 spec 根本就是個 [tl;dr] 的東西,但沒讀過 spec 也沒辦法輕鬆實作,更別說套現成的 gem 擋在 API 的前面。本演講會簡單介紹 OAuth 2 是怎麼一回事,並示範如何從零建立一個用 OAuth 2 鎖住的 Grape API。延伸閱讀: http://blog.yorkxin.org/tags/OAuth

OAuth2(2)

① 下载代码演示代码下载:② 打开IDEA导入代码③导入好了之后一定要记得改为我们自己配置好的maven,改好了之后我们关闭IDEA,重新打开它就会借助我们本地的aliyun进行下载。当它maven在下载东西的时候,它这里的地址就是http:aliyun.com。

weixin_67465673的博客 393

OAuth 2.0系列教程

OAuth 2.0 是目前比较流行的做法,它率先被Google, Yahoo, Microsoft, Facebook等使用。之所以标注为 2.0,是因为最初有一个1.0协议,但这个1.0协议被弄得太复杂,易用性差,所以没有得到普及。2.0是一个新的 设计,协议简单清晰,但它并不兼容1.0,可以说与1.0没什么关系。

Python如何调用新浪api接口的问题

前言:这些天在研究如何调用新浪开放平台的api分析新浪微博用户的数据 成果:成功调用了新浪api获取了用户的一些个人信息和无数条公共微博 不足:新浪开放平台访问有限制,返回的数据着实有限,不足以分析问题,真的要分析问题还是得个人写爬虫 下面是调用新浪开放api的过程: 第一步:按这个做就行 http://www.cnblogs.com/dhsunny/p/3578399.html

Forever_mumu的博客 3062

使用OAuth2简单教程.pdf

使用OAuth2简单教程,在web项目中使用OAuth2 作为身份验证

OAuth2.0协议中文版.pdf

OAuth 2.0是一个应用之间彼此访问数据的开源授权协议。本文档是OAuth 2.0协议的中文翻译资料,供大家参考。

java新浪微博OAuth2.0新版接口认证

最近在做一个基于新浪微博接口的软件,首先的一个技术难点就是sina的最新版的OAuth接口验证。首先,通过sina微博的java-OAuth 的测试来摸索android的方法。 下面介绍如何获取sina微博OAuth2.0新版接口认证。 首先去新浪开放平台注册自己的产品,获取到App Key、App Secret、授权回调页这三项数据。 下载sina微博java最新版的sdk代码,导入ec

Hugo的编程学习记录 3327

Drupal远程代码执行漏洞(CVE-2018-7600)实战复现:从检测到写入WebShell的全过程

本文详细解析了Drupal远程代码执行漏洞(CVE-2018-7600)的实战复现过程,从环境搭建、漏洞检测到WebShell写入的全流程。该高危漏洞影响Drupal 6.x至8.x版本,允许攻击者未经授权执行任意代码。文章提供了多种POC构造方法和高级利用技巧,帮助安全研究人员深入理解漏洞原理并掌握验证技术。

weixin_29322553的博客 275

android新浪微博开发最新OAuth2.0认证

新浪微博最近采用了新的OAuth2.0认证登录,之前并且发布了最新的SDK开发文档,对于初次接触android新浪微博开发的程序员来说这并不是一个好的事情。本身,OAuth2.0认证登录就不同于OAuth1.0认证,引用了新的认证机制,而网络上基于OAuth2.0认证登录的讲解确实是少的可怜,而对于新浪最新的android版微博SDK的讲解就基本是没有,这对于一些初学者来说实在是很麻烦的一个难题。

Hugo的编程学习记录 3177

S32DS 3.5.8离线包怎么用?保姆级教程教你手动安装S32K3开发环境(附资源下载)

本文详细介绍了S32DS 3.5.8离线包的安装方法,适用于S32K3开发环境的手动搭建。从资源获取、完整性验证到分步安装指南,提供了全面的离线部署解决方案,特别适合军工/车企内网开发等场景。文章还包含版本选择建议、常见问题排查及团队协作方案,帮助开发者高效完成环境配置。

weixin_30471561的博客 477

QTabWidget动态标签页管理:从代码创建到UI设计的实战指南

本文深入探讨了QTabWidget动态标签页管理的实战技巧,涵盖从纯代码创建到UI设计器布局的两种核心方法。详细讲解了如何动态添加、插入、关闭标签页,并管理其内容与生命周期。文章还提供了标签页精细化控制、界面优化(如设置图标、样式表)以及构建简易多文档编辑器的进阶实战案例,帮助开发者灵活应对数据监控、多文档编辑等复杂界面需求。

omega的博客 865

使用WebView实现新浪微博Oauth2.0认证(android)

接上篇博文提到了 android新浪微博Oauth2.0认证以及登录 http://blog.csdn.net/geniuseoe2012/article/details/7727564 也提到了写SDK的这家伙很坑爹的把界面元素也添到了SDK里面 而我们则希望SDK提供的是纯接口的东东 之前看到网上不少关于webview实现新浪微博认证,思路都是通过WebView显示的html代码

蓝斯的专栏 1万+

微信小程序 - 最新图片组拖拽排序更换位置功能,类似微信朋友圈九宫格图片的拖动排序效果,微信小程序实现九宫格图片拖拽调换位置,小程序详细实现图像拖曳拖动切换位置排序功能(详细示例代码,一键复制开箱即用

微信小程序,wechat,小程序,图片排序,图像排序,九宫格拖拽排序,拖曳,拖动,拖拽,仿微信朋友圈,朋友圈宫格图片排序,微信朋友圈图片拖动排序效果,实现九宫格图片拖拽,图像拖拽排序组件插件,小程序实现拖拽图片切换图片位置,图片拖动互换位置,图像拖拽切换位置,九宫格图片组合拖动排序,交换九宫格图片的位置,小程序上传图片后,如何实现拖拽排序功能,小程序怎么实现图片拖拽排序,微信小程序图片上传,九宫格拖拽组件,选择图片并拖动_微信小程序图片拖拽,微信小程序长按拖拽排序,图像的拖拽移动,多图拖拽排序功能,实现九宫

✅ 精选推荐文章 4453

新浪微博SSO登录方式及OAUTH2.0认证和获取我的微博

今天弄了下新浪微博SSO登录方式及OAUTH2.0认证和获取我的微博,实现的效果如下图: //========================================================================================================================== 就这么简单的界面,简单的请求json,我居然弄了

chenfuduo_loveit的专栏 4301

扣子(Coze)搭建智能体完整实战指南 —— 从零基础入门到写小说及其他需求扩展开发

随着大语言模型进入应用爆发期,我们正在经历从“寻找提示词”向“构建智能体”的范式转移。扣子(Coze)作为字节跳动推出的一站式AI智能体开发与运营平台,极大地降低了AI应用开发的门槛,让非技术人员也能快速搭建具备感知、决策、行动能力的智能体。 本文将手把手带你从零开始,在扣子平台上搭建一个功能完备的**小说创作智能体**,并基于此展示如何将同一套架构扩展到其他需求场景。无论你是写作爱好者、内容创作者,还是希望用AI赋能日常工作的职场人士,这套完整的技术方案都将帮助你快速上手。

huanghm88的专栏 636

计算机视觉与深度学习 | Matlab实现ORBSLAM2(附完整代码)

================================================ 博主github:https://github.com/MichaelBeechan 博主优快云:https://blog.csdn.net/u011344545 ================================================ 代码阅览 效果图 代码 imdsLeft = imageDatastore('C:\MichaelSpace\matlabworks

尘世冰封的专栏 1520

android通过oauth1.0发表新浪微博

经过我一天的研究,新浪微博已不支持oauth1.0的验证了,更新到2.0验证,虽然在FAQ里面写道了,但是TMD 新浪文档里面和SDK里面都有详细的oauth1.0的说明,真是坑爹啊,于是本文对于新浪的吐糟将会大于对于oauth1.0的解释 话说一直以为SDK(android)都很完善,拿来就能用的,知道我膝盖中了一箭。。。虽然SDK中直接用oauth2.0验证是可以直接用的,但是刚刚学习了oa

吴工的专栏 2633

【个人成长笔记】在Ubuntu中安装RTL8188GU USB无线网卡驱动(Driver for Linux RTL8188GU)

这篇笔记提供了在Ubuntu系统中安装RTL8188GU无线网卡驱动的完整指南。主要内容包括:驱动程序的官方来源(Github链接)、详细安装步骤(通过git下载、编译安装等命令),以及将设备转换为USB网卡模式的关键指令。特别提醒每次开机都需要执行模式转换命令,因为设备默认会以U盘模式启动。文章以简洁的技术文档形式呈现,适合Linux用户快速查阅和操作。

yuhuasheng1997的博客 1822

新浪微博OAuth2.0授权及使用python调用微博API

通过调用新浪微博API获取数据时数组采集中一个很好的方法,为了获取较新的资讯数据内容,本文主要介绍新浪微博OAuth2.0授权机制、微博开发者平台的使用、python调用微博API等内容,文末提供测试版python调用微博API的代码。 1. 新浪微博OAuth2.0授权机制 官方详解见连接: 新浪微博OAuth2.0授权机制 2.微博开发者平台的使用 地址:https://open.w...

HeyShHeyou的博客 2970

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: Lisp学习笔记(一)
下一篇: POJ 2505 A multiplication game 组合游戏
formyth
博客等级 码龄17年 9粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值