zoukankan      html  css  js  c++  java
  • 高级接口--OAuth2.0网页授权

    官方文档

    Auth是一个开放协议,允许用户让第三方应用以安全且标准的方式获取该用户在某以网站,移动或桌面应用上存储的司名的资源(如用户个人信息,照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

    OAuth2.0是OAuth协议的升级版本,关注客户端开发者的简易性,同时为Web应用,桌面应用及收集和起居室设备提供专门的认证流程。

    OAuth允许用户提供一个令牌,而不是用户名和密码来访问它们存放在特定服务提供者的数据。每一个令牌授权一个特性的网站在特定的时段内访问特定的资源。这样Oauth允许用户授权第三方网站访问它们存储在另外的服务提供者上的信息,而不需要分享它们的访问许可或它们数据的所有内容。

    授权过程:

    1. 用户关注微信公众账号
    2. 微信公众账号提供用户请求授权页面URL (开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;)
    3. 用户单击授权页面URL,向服务器发起请求
    4. 服务器询问用户是否同意授权给微信公众账号(scope 为snapi_base时无此步骤)
    5. 用户同意 (scope 为snapi_base时无此步骤)
    6. 服务器将code通过回调传给微信公众号
    7. 微信公众账号获得code
    8. 微信公众号通过code向服务器请求access token
    9. 服务器返回Access Token 和OpenID给微信公众号
    10. 微信公众账号通过Access Token 向服务器请求用户信息(scope 为snsapi_base时无此步骤)
    11. 服务器将用户信息会送给微信公众账号(scope 为snsapi_base时无此步骤)

    实现 3):

      把认证的链接推送给用户:

            elif isinstance(recMsg,ReceiveTextMsg):
                #测试 Oauth认证
                content = '<a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx349372b8988f6776&redirect_uri=http://ahmay.ngrok2.xiaomiqiu.cn/&response_type=code&scope=snsapi_base&state=1#wechat_redirect">' 
                          '单击这里体验OAuth授权</a>'
               # replyMsg = ReplyTextMsg(recMsg.FromUserName,recMsg.ToUserName,recMsg.Content)
                replyMsg = ReplyTextMsg(recMsg.FromUserName, recMsg.ToUserName, content)

      scope:

        snsapi_base: 单击链接后,不会弹出授权页面

        snsapi_userinfo:单击链接后,会弹出授权页面

      单击后,重定向的链接里面会包含 code和state参数. (开发者可以填写任意state参数)

      

     实现 8)用code换access_token

    def exchange_access_token(code):
        exchange_url = ' https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code'.format(
            wechat_Const.appId,wechat_Const.appSecret,code
        )
        response = requests.get(exchange_url)
        return json.loads(response.text)

     返回:

    {'access_token': '28_HVHo_-O6ijddWk2tesCOoyNQZOBudlByenwX5s9jTQxaz5bl5MEDXOGyM_UnP83FMiZv8L85EHjo2atet3Dgf_1HJy4yzZnMPz5Aci3kEwo', 'expires_in': 7200, 'refresh_token': '28_a3YKiuKaeQhx5rGx9jCYn6NyrFycQwBgq25ofsIiqYWf0lcn2VL3uNqK6LgKBLwEgZiNGCKrAATn5QqDgAzVBP9-pwn9nheMRXogEe_jxrM', 'openid': 'o-TXmsiCVUNT0iDRRaiW8iTxhx4Q', 'scope': 'snsapi_userinfo'}

    当 access_token超时后,可以使用refresh_token进行刷新,refresh_token 拥有较长的有效期(7天,30天,60天,90天),当refresh_token失效后,需要用户重新授权.

    def refresh_access_token(refresh_token):
        refresh_url = 'https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type=refresh_token&refresh_token={1}'.format(
            wechat_Const.appId,refresh_token
        )
        response = requests.get(refresh_url)
        return json.loads(response.text)

    返回同样格式的json数据。

    实现 10)使用access_token获取用户信息(scope 为snsapi_userinfo)

    def query_userinfo(access_token,openid,lang='zh_CN'):
        query_url='https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang={2}'.format(
            access_token,openid,lang
        )
        response = requests.get(query_url)
        return json.loads(response.content)

    验证 access_token是否有效的实践:

    def very_access_token_valid(access_token,openid):
        very_url = 'https://api.weixin.qq.com/sns/auth?access_token={0}&openid={1}'.format(access_token,openid)
        response = requests.get(very_url)
        result = json.loads(response.text)
        if result['errcode'] == 0:
            return True
        else:
            return False
  • 相关阅读:
    题目1522:包含min函数的栈
    [Swift]LeetCode1157. 子数组中占绝大多数的元素 | Online Majority Element In Subarray
    [Swift]LeetCode1156. 单字符重复子串的最大长度 | Swap For Maximum Repeated Substring
    [Swift]LeetCode1153. 字符串转化 | String Transforms Into Another String
    [Swift]LeetCode1151. 最少交换次数来组合所有的 1 | Minimum Swaps to Group All 1's Together
    [Swift]LeetCode1154. 一年中的第几天 | Ordinal Number Of Date
    [Swift]LeetCode1152. 用户网站访问行为分析 | Analyze User Website Visit Pattern
    [Swift]LeetCode1150. 检查一个数是否在数组中占绝大多数 | Check If a Number Is Majority Element in a Sorted Array
    [Swift]LeetCode1146. 快照数组 | Snapshot Array
    [Swift]LeetCode1147. 段式回文 | Longest Chunked Palindrome Decomposition
  • 原文地址:https://www.cnblogs.com/ahMay/p/12056353.html
Copyright © 2011-2022 走看看