zoukankan      html  css  js  c++  java
  • 身份验证——网页授权登录

    OAuth2简介

    OAuth2的设计背景,在于允许用户在不告知第三方自己的帐号密码情况下,通过授权方式,让第三方服务可以获取自己的资源信息。企业微信提供了OAuth的授权登录方式,可以让从企业微信终端打开的网页获取成员的身份信息,从而免去登录的环节。企业应用中的URL链接(包括自定义菜单或者消息中的链接),均可通过OAuth2.0验证接口来获取成员的UserId身份信息。

    企业微信OAuth2接入流程

    使用OAuth2前须知

      关于网页授权的可信域名

      REDIRECT_URL中的域名,需要先配置至应用的“可信域名”,否则跳转时会提示“redirect_uri参数错误”。
      要求配置的可信域名,必须与访问链接的域名完全一致。举个例子:

    • 假定重定向访问的链接是:http://mail.qq.com:8080/cgi-bin/helloworld:
    配置域名是否正确原因
    mail.qq.com:8080 correct 配置域名与访问域名完全一致
    email.qq.com error 配置域名必须与访问域名完全一致
    support.mail.qq.com error 配置域名必须与访问域名完全一致
    *.qq.com error 不支持泛域名设置
    mail.qq.com error 配置域名必须与访问域名完全一致,包括端口号
    • 假定配置的可信域名是 mail.qq.com:
    访问链接是否正确原因
    https://mail.qq.com/cgi-bin/helloworld correct 配置域名与访问域名完全一致
    http://mail.qq.com/cgi-bin/redirect correct 配置域名与访问域名完全一致,与协议头/链接路径无关
    https://exmail.qq.com/cgi-bin/helloworld error 配置域名必须与访问域名完全一致

      关于UserID机制

      UserId用于在一个企业内唯一标识一个用户,通过网页授权接口可以获取到当前用户的UserId信息,如果需要获取用户的更多信息可以调用 通讯录管理 - 成员接口 来获取。

      静默授权与手动授权

      •   静默授权:用户点击链接后,页面直接302跳转至 redirect_uri?code=CODE&state=STATE
      •   手动授权:用户点击链接后,会弹出一个中间页,让用户选择是否授权,用户确认授权后再302跳转至 redirect_uri?code=CODE&state=STATE

      缓存方案建议

      通过OAuth2.0验证接口获取成员身份会有一定的时间开销。对于频繁获取成员身份的场景,建议采用如下方案:
      1、企业应用中的URL链接直接填写企业自己的页面地址
      2、成员操作跳转到步骤1的企业页面时,企业后台校验是否有标识成员身份的cookie信息,此cookie由企业生成
      3、如果没有匹配的cookie,则重定向到OAuth验证链接,获取成员的身份信息后,由企业后台植入标识成员身份的cookie信息
      4、根据cookie获取成员身份后,再进入相应的页面

    构造网页授权链接

      

      构造第三方应用oauth2链接

       如果第三方应用需要在打开的网页里面携带用户的身份信息,第一步需要构造如下的链接来获取code:

      https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&agentid=AGENTID&state=STATE#wechat_redirect

      

    参数必须说明
    appid 企业的CorpID
    redirect_uri 授权后重定向的回调链接地址,请使用urlencode对链接进行处理
    response_type 返回类型,此时固定为:code
    scope 应用授权作用域。
    snsapi_base:静默授权,可获取成员的的基础信息(UserId与DeviceId);
    snsapi_userinfo:静默授权,可获取成员的详细信息,但不包含手机、邮箱;
    snsapi_privateinfo:手动授权,可获取成员的详细信息,包含手机、邮箱
    注意:企业自建应用可以根据userid获取成员详情,无需使用snsapi_userinfo和snsapi_privateinfo两种scope。更多说明见scope
    agentid 企业应用的id。
    当scope是snsapi_userinfo或snsapi_privateinfo时,该参数必填
    注意redirect_uri的域名必须与该应用的可信域名一致。
    state 重定向后会带上state参数,企业可以填写a-zA-Z0-9的参数值,长度不可超过128个字节
    #wechat_redirect 终端使用此参数判断是否需要带上身份信息

       员工点击后,页面将跳转至 redirect_uri?code=CODE&state=STATE,企业可根据code参数获得员工的userid。code长度最大为512字节。

      scope的特殊情况

      • scope为snsapi_userinfo或snsapi_privateinfo时,必须填agentid参数,否则系统会视为snsapi_base,不会返回敏感信息。
      • 第三方服务商配置scope为snsapi_privateinfo时,agentid所对应的应用必须有“成员敏感信息授权”的权限。“成员敏感信息授权”的开启方法为:登录服务商管理后台->标准应用服务->本地应用->进入应用->点击基本信息栏“编辑”按钮->勾选”成员敏感信息”
      • 企业自建应用调用读取成员接口没有字段限制,可以获取包括敏感字段在内的所有信息。因此,只有第三方应用才有必要使用snsapi_userinfo或snsapi_privateinfo的scope。

    获取访问用户身份

      请求方式:GET(HTTPS)
      请求地址:https://qyapi.weixin.qq.com/cgi-bin/service/getuserinfo3rd?access_token=SUITE_ACCESS_TOKEN&code=CODE

       

      参数说明:

    参数必须说明
    access_token 第三方应用的suite_access_token,参见“获取第三方应用凭证”
    code 通过成员授权获取到的code,最大为512字节。每次成员授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

       

      权限说明:
      跳转的域名须完全匹配access_token对应第三方应用的可信域名,否则会返回50001错误。

       

      返回结果:

         a) 当用户属于某个企业,返回示例如下:   

          {
            "errcode": 0,
            "errmsg": "ok",
            "CorpId":"CORPID",
            "UserId":"USERID",
            "DeviceId":"DEVICEID",
            "user_ticket": "USER_TICKET",
            "expires_in":7200
          }

    参数说明
    errcode 返回码
    errmsg 对返回码的文本描述内容
    CorpId 用户所属企业的corpid
    UserId 用户在企业内的UserID,如果该企业与第三方应用有授权关系时,返回明文UserId,否则返回密文UserId
    DeviceId 手机设备号(由企业微信在安装时随机生成,删除重装会改变,升级不受影响)
    user_ticket 成员票据,最大为512字节。
    scope为snsapi_userinfo或snsapi_privateinfo,且用户在应用可见范围之内时返回此参数。
    后续利用该参数可以获取用户信息或敏感信息,参见“第三方使用user_ticket获取成员详情”
    expires_in user_ticket的有效时间(秒),随user_ticket一起返回

         b) 若用户不属于任何企业,返回示例如下:

          {
            "errcode": 0,
            "errmsg": "ok",
            "OpenId":"OPENID",
            "DeviceId":"DEVICEID"
          }

    参数说明
    errcode 返回码
    errmsg 对返回码的文本描述内容
    OpenId 非企业成员的标识,对当前服务商唯一
    DeviceId 手机设备号(由企业微信在安装时随机生成,删除重装会改变,升级不受影响)

        

    获取访问用户敏感信息

       请求方式:POST(HTTPS)
       请求地址:https://qyapi.weixin.qq.com/cgi-bin/service/getuserdetail3rd?access_token=SUITE_ACCESS_TOKEN

       请求包体:

      {

        "user_ticket": "USER_TICKET"

      }

      

      参数说明:

    参数必须说明
    access_token 第三方应用的suite_access_token,参见“获取第三方应用凭证”
    user_ticket 成员票据

      

      权限说明:
      成员必须在授权应用的可见范围内。

      返回结果:

        {
          "errcode": 0,
          "errmsg": "ok",
          "corpid":"wwxxxxxxyyyyy",
          "userid":"lisi",
          "name":"李四",
          "mobile":"15913215421",
          "gender":"1",
          "email":"xxx@xx.com",
          "avatar":"http://shp.qpic.cn/bizmp/xxxxxxxxxxx/0",
          "qr_code":"https://open.work.weixin.qq.com/wwopen/userQRCode?vcode=vcfc13b01dfs78e981c"
        }

        参数说明:

    参数说明
    errcode 返回码
    errmsg 对返回码的文本描述内容
    corpid 用户所属企业的corpid
    userid 成员UserID
    name 成员姓名
    mobile 成员手机号,仅在用户同意snsapi_privateinfo授权时返回
    gender 性别。0表示未定义,1表示男性,2表示女性
    email 成员邮箱,仅在用户同意snsapi_privateinfo授权时返回
    avatar 头像url。注:如果要获取小图将url最后的”/0”改成”/100”即可。仅在用户同意snsapi_privateinfo授权时返回
    qr_code 员工个人二维码(扫描可添加为外部联系人),仅在用户同意snsapi_privateinfo授权时返回

      

  • 相关阅读:
    BZOJ_3171_[Tjoi2013]循环格_最小费用最大流
    BZOJ_1150_[CTSC2007]数据备份Backup_堆+贪心
    BZOJ_1576_[Usaco2009 Jan]安全路经Travel&&BZOJ_3694_最短路_树链剖分+线段树
    BZOJ_4802_欧拉函数_MR+pollard rho+欧拉函数
    BZOJ_3667_Rabin-Miller算法_Mille_Rabin+Pollard rho
    BZOJ_1584_[Usaco2009 Mar]Cleaning Up 打扫卫生_DP
    BZOJ_1229_[USACO2008 Nov]toy 玩具_三分+贪心
    BZOJ_2160_拉拉队排练_manacher
    [转载]Linux软件包及dpkgapt等方法
    服务器基础认知杂谈及一小点运维相关
  • 原文地址:https://www.cnblogs.com/snail90/p/10044824.html
Copyright © 2011-2022 走看看