使用OAuth2.0访问豆瓣API
如何计算某个用户的access_token过期时间?
开发者可以通过两种方式计算:
用户授权时,oauth2/access_token接口返回的expires_in值就是access_token的生命周期。
从上述对应表中,找到应用所对应的授权有效期,过期时间 = 用户授权时间 + 授权有效期
使用OAuth2.0访问豆瓣API
豆瓣支持OAuth2.0协议的授权访问。关于OAuth2.0协议规范,请参考这里。
使用OAuth2.0的流程可以简单概括为:
- 应用向豆瓣请求授权
- 豆瓣为用户显示一个授权页面,用户在此页面确认是否同意应用的请求
- 如果用户同意授权,应用会获取到一个访问令牌(access_token),通过此令牌,应用可以访问授权用户的数据。
- 如果访问需要授权的Api,请使用https协议,加上access_token的Header,具体见获取access_token
豆瓣支持三种OAuth2.0的授权流程:
- 服务器的WEB应用的授权流程(server-side flow)
- 桌面客户端应用、移动客户端应用的授权流程(native-application flow)
- 直接在浏览器中运行的Javascript应用的授权流程(user-agent flow)
flow 与 native-application flow
这两种授权流程基本相同,需要通过两步来获取access_token。
获取authorization_code
通过在浏览器中访问下面的地址,来引导用户授权,并获得authorization_code
https://www.douban.com/service/auth2/auth
参数:
| 参数名称 | 参数说明 |
| client_id | 必选参数,应用的唯一标识,对应于APIKey |
| redirect_uri | 必选参数,用户授权完成后的回调地址,应用需要通过此回调地址获得用户的授权结果。此地址必须与在应用注册时填写的回调地址一致。 |
| response_type | 必选参数,此值可以为 code 或者 token 。在本流程中,此值为 code |
| scope | 可选参数,申请权限的范围,如果不填,则使用缺省的scope。如果申请多个scope,使用逗号分隔。 |
| state | 可选参数,用来维护请求和回调状态的附加字符串,在授权完成回调时会附加此参数,应用可以根据此字符串来判断上下文关系。 |
注意:此请求必须是HTTP GET方式
例如:
https://www.douban.com/service/auth2/auth?
client_id=0b5405e19c58e4cc21fc11a4d50aae64&
redirect_uri=https://www.example.com/back&
response_type=code&
scope=shuo_basic_r,shuo_basic_w,douban_basic_common
返回结果:
当用户拒绝授权时,浏览器会重定向到redirect_uri,并附加错误信息
https://www.example.com/back?error=access_denied
当用户同意授权时,浏览器会重定向到redirect_uri,并附加autorization_code
https://www.example.com/back?code=9b73a4248
获取access_token
https://www.douban.com/service/auth2/token
| 参数名称 | 参数说明 |
| client_id | 必选参数,应用的唯一标识,对应于APIKey |
| client_secret | 必选参数,应用的唯一标识,对应于豆瓣secret |
| redirect_uri | 必选参数,用户授权完成后的回调地址,应用需要通过此回调地址获得用户的授权结果。此地址必须与在应用注册时填写的回调地址一致 |
| grant_type | 必选参数,此值可以为 authorization_code 或者 refresh_token 。在本流程中,此值为 authorization_code |
| code | 必选参数,上一步中获得的authorization_code |
注意:此请求必须是HTTP POST方式
例如:
https://www.douban.com/service/auth2/token?
client_id=0b5405e19c58e4cc21fc11a4d50aae64&
client_secret=edfc4e395ef93375&
redirect_uri=https://www.example.com/back&
grant_type=authorization_code&
code=9b73a4248
返回结果:
{
"access_token":"a14afef0f66fcffce3e0fcd2e34f6ff4",
"expires_in":3920,
"refresh_token":"5d633d136b6d56a41829b73a424803ec",
"douban_user_id":"1221"
}
使用access_token
curl "https://api.douban.com/v2/user/~me"
-H "Authorization: Bearer a14afef0f66fcffce3e0fcd2e34f6ff4"
access_token有效期 与 refresh_token
在OAuth2.0中,access_token不再长期有效。在授权获取access_token时会一并返回其有效期,也就是返回值中的expires_in参数。
在access_token使用过程中,如果服务器返回106错误:“access_token_has_expired ”,此时,说明access_token已经过期,除了通过再次引导用户进行授权来获取access_token外,还可以通过refresh_token的方式来换取新的access_token和refresh_token。
通过refresh_token换取access_token的处理过程如下:
https://www.douban.com/service/auth2/token
| 参数名称 | 参数说明 |
| client_id | 必选参数,应用的唯一标识,对应于APIKey |
| client_secret | 必选参数,应用的唯一标识,对应于豆瓣secret |
| redirect_uri | 必选参数,用户授权完成后的回调地址,应用需要通过此回调地址获得用户的授权结果。此地址必须与在应用注册时填写的回调地址一致 |
| grant_type | 必选参数,此值可以为 authorization_code 或者 refresh_token。在本流程中,此值为 refresh_token |
| refresh_token | 必选参数,刷新令牌 |
注意:此请求必须是HTTP POST方式,refresh_token只有在access_token过期时才能使用,并且只能使用一次。当换取到的access_token再次过期时,使用新的refresh_token来换取access_token
例如:
https://www.douban.com/service/auth2/token?
client_id=0b5405e19c58e4cc21fc11a4d50aae64&
client_secret=edfc4e395ef93375&
redirect_uri=https://www.example.com/back&
grant_type=refresh_token&
refresh_token=5d633d136b6d56a41829b73a424803ec
返回结果:
{
"access_token":"0e63c03dfb66c4172b2b40b9f2344c45",
"expires_in":3920,
"refresh_token":"84406d40cc58e0ae8cc147c2650aa20a",
"douban_user_id":"1000"
}
| 级别 | access_token有效期 | refresh_token有效期 | 说明 |
| L1 | 7天 | 14天 | |
| L2 | 30天 | 60天 | |
| L3 | 90天 | 180天 |
需要授权的Api访问速度控制
在用户、应用、服务器IP、scope等维度对接口的访问速度进行限制。
针对服务器IP:
| 级别 | 限制 |
| L1 | 5000次/小时 |
| L2 | 10000次/小时 |
| L3 | 20000次/小时 |
针对单用户每应用每scope:
| 级别 | 限制 |
| L1 | 500次/小时 |
| L2 | 1000次/小时 |
| L3 | 2000次/小时 |
返回结果的header里会有当前访问限制信息:
| Header名称 | 含义 |
| X-Ratelimit-Limit | 单用户每小时次数 |
| X-RateLimit-Remaining | 单用户每小时剩余次数 |
| X-Ratelimit-Limit2 | 单ip每小时次数 |
| X-RateLimit-Remaining2 | 单ip每小时剩余次数 |
错误代码
如果在API使用过程中,有错误,则返回结果为:
{
"code":113,
"msg":"required_parameter_is_missing: client_id",
"request":"GET /shuo/statuses/232323"
}
| 错误代码 | 错误说明 |
| 100 | invalid_request_scheme 错误的请求协议 |
| 101 | invalid_request_method 错误的请求方法 |
| 102 | access_token_is_missing 未找到access_token |
| 103 | invalid_access_token access_token不存在或已被用户删除,或者用户修改了密码 |
| 104 | invalid_apikey apikey不存在或已删除 |
| 105 | apikey_is_blocked apikey已被禁用 |
| 106 | access_token_has_expired access_token已过期 |
| 107 | invalid_request_uri 请求地址未注册 |
| 108 | invalid_credencial1 用户未授权访问此数据 |
| 109 | invalid_credencial2 apikey未申请此权限 |
| 110 | not_trial_user 未注册的测试用户 |
| 111 | rate_limit_exceeded1 用户访问速度限制 |
| 112 | rate_limit_exceeded2 IP访问速度限制 |
| 113 | required_parameter_is_missing 缺少参数 |
| 114 | unsupported_grant_type 错误的grant_type |
| 115 | unsupported_response_type 错误的response_type |
| 116 | client_secret_mismatch client_secret不匹配 |
| 117 | redirect_uri_mismatch redirect_uri不匹配 |
| 118 | invalid_authorization_code authorization_code不存在或已过期 |
| 119 | invalid_refresh_token refresh_token不存在或已过期 |
| 120 | username_password_mismatch 用户名密码不匹配 |
| 121 | invalid_user 用户不存在或已删除 |
| 122 | user_has_blocked 用户已被屏蔽 |
| 123 | access_token_has_expired_since_password_changed 因用户修改密码而导致access_token过期 |
| 124 | access_token_has_not_expired access_token未过期 |
| 125 | invalid_request_scope 访问的scope不合法,开发者不用太关注,一般不会出现该错误 |
| 999 | unknown 未知错误 |
| HTTP状态码 | 说明 |
| 200 | 表明api的请求正常 |
| 400 | 表明api的请求出错,具体原因参考上面列出的错误码 |
使用OAuth2.0访问豆瓣API的更多相关文章
- 微信小程序访问豆瓣api报403错误解决方法
通过豆瓣API可以获取很多电影.书籍的数据信息,今天在调用豆瓣正在上映电影接口的时候报403错误,原因是豆瓣设置了小程序的访问权限.如下: 解决方法是使用代理,将豆瓣API地址换成 https://d ...
- Laravel5.4 Oauth2.0认证应用 API 实战!
项目初始化 新建项目 lukeyans-MacBook-Pro:laravel lukeyan$ laravel new laravel_demo 添加laravel自带的Passport服务 luk ...
- OAuth2.0学习(1-11)新浪开放平台微博认证-使用OAuth2.0调用微博的开放API
使用OAuth2.0调用API 使用OAuth2.0调用API接口有两种方式: 1. 直接使用参数,传递参数名为 access_token URL 1 https://api.weibo.com/2/ ...
- asp.net core系列 57 IS4 使用混合流(OIDC+OAuth2.0)添加API访问
一.概述 在上篇中,探讨了交互式用户身份验证,使用的是OIDC协议. 在之前篇中对API访问使用的是OAuth2.0协议.这篇把这两个部分放在一起,OpenID Connect和OAuth 2.0组合 ...
- 新浪微博API Oauth2.0 认证
原文链接: http://rsj217.diandian.com/post/2013-04-17/40050093587 本意是在注销账号前保留之前的一些数据.决定用python 爬取收藏.可是未登录 ...
- C# 网络编程之豆瓣OAuth2.0认证具体解释和遇到的各种问题及解决
近期在帮人弄一个豆瓣API应用,在豆瓣的OAuth2.0认证过程中遇到了各种问题,同一时候自己须要一个个的尝试与解决,终于完毕了豆瓣API的訪问.作者这里就不再吐槽豆瓣的认证文档了,毕 ...
- 新浪微博Oauth2.0授权认证及SDK、API的使用(Android)
---------------------------------------------------------------------------------------------- [版权申明 ...
- IdentityServer4:IdentityServer4+API+Client实践OAuth2.0客户端模式(1)
一.OAuth2.0 1.OAuth2.0概念 OAuth2.0(Open Authorization)是一个开放授权协议:第三方应用不需要接触到用户的账户信息(如用户名密码),通过用户的授权访问用户 ...
- Oauth2.0 认证的Web api例子
Oauth2.0的解释 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容.OA ...
随机推荐
- 图的深度优先遍历DFS
图的深度优先遍历是树的前序遍历的应用,其实就是一个递归的过程,我们人为的规定一种条件,或者说一种继续遍历下去的判断条件,只要满足我们定义的这种条件,我们就遍历下去,当然,走过的节点必须记录下来,当条件 ...
- PHP 表单验证 - 验证 E-mail 和 URL
----------------------------------------------------------------------------- 本节展示如何验证名字.电邮和 URL. -- ...
- Dreamweaver8卡死打开初始化(缓存重建)失败的解决的方法
无论是中文版的dreamweaver 8,还是英文版本号的dw8或绿色版本号的DW8,都可能出现打开时卡死无法启动的情况,这个bug的出现是由于先前你以前在使用dreamweaver 8的时候,定义了 ...
- Babel6.x 转换ES6
本文介绍Babel6.x的安装过程~ 首先呢,可以使用Babel在线转换 https://babeljs.io/repl/ 然后进入主题:安装Babel(命令行环境,针对Babel6.x版本) 1.首 ...
- Sybase配置中文语言支持及字符集
在windows平台上,Sybase ASE15.0.7安装完成后默认语言是:英语(us_english),默认字符集为:cp850.cp850是一个西欧字符集,虽然也能使用cp850字符集保存汉字, ...
- [WARNING] Warning: selected war files include a WEB-INF/web.xml which will be ignored (webxml attribute is missing from war task, or ignoreWebxml attribute is specified as 'true')
WARNING] Warning: selected war files include a WEB-INF/web.xml which will be ignored (webxml attribu ...
- mysql 服务不见了的解决办法
昨天打开电脑mysql突然连接不了了,去服务里找,却找不到mysql服务了 解决:5.0版本:开始->运行->cmd,进到mysql安装的bin目录D:\MySQL\bin>mysq ...
- C# DES 加密解密
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.S ...
- 【初级坑跳跳跳】第一个应用布局学习的代码运行时出错(manifest里未将activity先注册,控件错误)
首先,根据书中想要实现的结果,看了下书中代码,大致知道布局是怎么样的,然后根据图片自己写xml, 1.运行时第一个坑是 忘记在AndroidManifest.xml里先注册activity,导致运行时 ...
- C# Hashtable 使用说明 以及 Hashtable和HashMap的区别
一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其 ...