zoukankan      html  css  js  c++  java
  • 使用OAuth2.0访问豆瓣API


    如何计算某个用户的access_token过期时间?
    开发者可以通过两种方式计算:
    用户授权时,oauth2/access_token接口返回的expires_in值就是access_token的生命周期。
    从上述对应表中,找到应用所对应的授权有效期,过期时间 = 用户授权时间 + 授权有效期

    使用OAuth2.0访问豆瓣API

    豆瓣支持OAuth2.0协议的授权访问。关于OAuth2.0协议规范,请参考这里

    使用OAuth2.0的流程可以简单概括为:

    1. 应用向豆瓣请求授权
    2. 豆瓣为用户显示一个授权页面,用户在此页面确认是否同意应用的请求
    3. 如果用户同意授权,应用会获取到一个访问令牌(access_token),通过此令牌,应用可以访问授权用户的数据。
    4. 如果访问需要授权的Api,请使用https协议,加上access_token的Header,具体见获取access_token

    豆瓣支持三种OAuth2.0的授权流程:

    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的请求出错,具体原因参考上面列出的错误码
  • 相关阅读:
    C#调用java类、jar包方法
    利用IKVM在C#中调Java程序
    同样版本的jstl,都是jstl1.2版本,有个有问题,另一个没有问题
    Python安装及开发环境配置
    jQuery EasyUI parser 的使用场景
    关于HttpURLConnection.setFollowRedirects
    HttpUrlConnection 的 setDoOutput 与 setDoInput
    【Mybatis】向MySql数据库插入千万记录 单条插入方式,用时 1h16m30s
    [MyBatis]再次向MySql一张表插入一千万条数据 批量插入 用时5m24s
    [MyBatis]向MySql数据库插入一千万条数据 批量插入用时6分 之前时隐时现的异常不见了
  • 原文地址:https://www.cnblogs.com/fx2008/p/3282942.html
Copyright © 2011-2022 走看看