OAuth2.0 授权码登录

9,850 阅读4分钟

基本流程

  1. 获取授权码code
  2. 通过授权码获取访问令牌access_token
  3. 通过访问令牌获取用户信息(用户不存在时用于注册新用户)

微信

微信平台的用户登录授权使用 OAuth2.0 授权码模式(authorization_code)

获取授权码

各个流程的主要差别在于 code 的获取方式不同

  • 移动应用登录,通过客户端SDK取得 code
  • 网站应用登录,通过授权链接回调获取 code (open.weixin.qq.com/connect/qrc…)
  • 网站应用JS登录,将微信登录二维码内嵌到自己页面中,用户使用微信扫码授权后通过JS将code返回给网站
  • 公众号网页授权,通过授权链接回调获取 code (open.weixin.qq.com/connect/oau…)

接口

// 网站应用获取授权码
https://open.weixin.qq.com/connect/qrconnect?appid=[x]&redirect_uri=[x]&scope=[x]&state=[x]&response_type=code#wechat_redirect

// 公众号网页获取授权码 - 此接口仅能在微信客户端调用
https://open.weixin.qq.com/connect/oauth2/authorize?appid=[x]&redirect_uri=[x]&scope=[x]&state=[x]&response_type=code#wechat_redirect

// 获取访问令牌
https://api.weixin.qq.com/sns/oauth2/access_token?appid=[x]&secret=[x]&code=[x]&grant_type=authorization_code

// 获取用户信息
https://api.weixin.qq.com/sns/userinfo?access_token=[x]&openid=[x]&lang=zh_CN

公众号网页授权流程

  1. 通过静默授权(scope=snsapi_base)获取code,然后取得 access_token/union_id/open_id
  2. 尝试通过 union_id/open_id 获取用户,如果用户存在,重定向到目标页面
  3. 如果用户不存在,通过非静默授权(scope=snsapi_userinfo)获取code,然后取得用户信息
  4. 使用用户信息注册新用户,然后重定向到目标页面

页面重定向过程

网站应用JS登录

将微信登录二维码内嵌到自己页面中,用户使用微信扫码授权后通过JS将code返回给网站。

  1. 引入JS文件 https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js
  2. 获取 code
var obj = new WxLogin({
  self_redirect:true,
  id:"login_container", 
  appid: "", 
  scope: "", 
  redirect_uri: "",
  state: "",
  style: "",
  href: ""
});

scope 取值

  • scope=snsapi_base,静默授权,不取获取用户信息,用户感知的就是直接进入了回调页(业务页面)
  • scope=snsapi_userinfo,需要用户手动同意,可以获得用户信息
  • scope=snsapi_login 用于网站应用登录

授权access_token和普通access_token

  • 授权access_token 通过OAuth2.0授权码模式(grant_type=authorization_code)获取的,是应用代理用户访问接口的凭证,后续可用于获取用户基本信息
  • 普通access_token 通过OAuth2.0客户端凭证模式(grant_type=client_credential)获取的,用于应用直接访问接口

获取 access_token developers.weixin.qq.com/doc/offiacc…

unionid 与 openid

应用未关联开放平台时,只有 openid,关联开放平台后才有 unionid

  • unionid 用户在同一开放平台账号的 unionid 是唯一的
  • openid 用户在不同应用中的 openid 是不同的

QQ

QQ平台的用户登录授权使用 OAuth2.0 授权码模式(authorization_code) QQ平台的 unionid 与 openid,机制与微信一致

接口

// QQ网站应用获取授权码 
https://graph.qq.com/oauth2.0/authorize?client_id=[x]&redirect_uri=[x]&scope=[x]&response_type=code

// 获取访问令牌
https://graph.qq.com/oauth2.0/token?client_id=[x]&client_secret=[x]&code=[x]&redirect_uri=[x]&grant_type=authorization_code&fmt=json

// 获取openid/unionid
https://graph.qq.com/oauth2.0/me?access_token=[x]&fmt=json

// 获取用户信息
https://graph.qq.com/user/get_user_info?access_token=[x]&oauth_consumer_key=[x]&openid=[x]&fmt=json

对于 scope,传 get_user_info 就行了,没有静默授权

支付宝

支付宝各平台的用户登录授权使用 OAuth2.0 授权码模式(authorization_code) 支付宝返回全局支付宝用户id(user_id),未使用 unionid/openid 机制

接口

// 网站应用/生活号 获取授权码 
https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=[x]&scope=[x]&redirect_uri=[x]&state=init 

// 获取访问令牌
`alipay.system.oauth.token` 

// 获取用户信息
`alipay.user.info.share`

scope 取值

  • scope=auth_base,静默授权,不取获取用户信息,用户感知的就是直接进入了回调页(业务页面)
  • scope=auth_user,需要用户手动同意,可以获得用户信息

抖音/头条

抖音/头条平台的用户登录授权也是使用 OAuth2.0 授权码模式(authorization_code) 抖音/头条平台 unionid 与 openid,机制与微信一致

接口

// 网站应用获取授权码
https://open.douyin.com/platform/oauth/connect/

// 静默授权获取授权码 - 必须在抖音端内可以打开的h5页面调用才有效
https://aweme.snssdk.com/oauth/authorize/v2/

// 获取访问令牌
https://open.douyin.com/oauth/access_token

// 获取用户信息
https://open.douyin.com/platform/oauth/userinfo

scope 取值

  • scope=login_id,静默授权,不获取用户信息,请求的接口是
  • scope=user_info,需要用户手动同意,可以获得用户信息