Authing 知识库
🛠 开发资源🥂 集成案例🔭 常见问题🖥 控制台
3.0.0
3.0.0
  • 欢迎
  • Authing 概述
  • 快速开始
    • 注册 Authing 开发者账号
    • 第一个应用
    • 基础概念
    • 实现单点登录
    • 控制台概览
    • 部署模型和价格
    • 最佳开发实践
    • 我该如何选择 Authing 的技术
  • 进阶指南
    • 理解认证和授权
      • 用户名 - 密码认证
      • 邮箱 - 密码认证
      • 手机 - 验证码认证
      • JWT Token 释义及使用
    • 验证 Token
    • 配置用户权限
    • 迁移老数据进 Authing
    • 错误代码
  • 认证
    • 接入 OAuth 2.0
      • 创建 OAuth 应用
      • 使用 OAuth 授权
    • 接入 OpenID Connect
      • 创建 OIDC 应用
      • 使用 OIDC 授权
      • 理解 OIDC 流程
      • OIDC 常见问题
    • 接入 SAML
      • 创建 SAML Identity Provider 应用
      • 创建 SAML Service Provider 应用
      • 理解 SAML 流程
      • 同时使用 Authing 作为 SP 和 IdP
      • 使用 SAML Identity Provider
        • 在阿里云访问管理中使用
        • 在腾讯云访问管理中使用
        • 在 Auth0 中使用
      • 使用 SAML Service Provider
        • 与 Auth0 SAML IdP 对接
        • 与 SSOCircle SAML IdP 对接
    • 接入 LDAP
      • 配置 LDAP 服务
      • 使用 Authing 的 LDAP 用户目录
    • 接入 Active Directory
  • 社会化登录
    • 接入 Web 端社会化登录
      • GitHub 登录
      • 微信 PC 扫码登录
      • 微信 APP 内网页登录
      • 企业微信(第三方应用)网页授权登录
      • 企业微信(第三方应用)扫码登录
      • 企业微信(企业内部)扫码登录
      • 新浪微博登录
      • 钉钉登录
      • QQ 登录
      • 配置登录授权 Scope
    • 接入移动端社会化登录
      • 微信登录
      • 支付宝登录
    • 接入小程序登录
      • 小程序登录
        • 用户登录凭证(code)最佳实践
      • APP 拉起小程序登录
    • 打通微信账号体系
  • 扫码登录
    • 小程序扫码登录
      • 接入私有化小程序
    • APP 扫码登录
      • 快速接入
      • Web 端 SDK
      • 完整接口列表
      • 自定义配置项
      • 扫码登录原理
  • 移动应用登录
    • 移动应用 SSO
      • 自动检测登录
      • 唤起 App 登录
    • 移动应用身份提供商
  • 授权
    • Authorization 基础概念
      • 什么是基于角色的管理(RBAC)
      • 什么是基于属性的管理(ABAC)
      • 什么是零信任网络
    • Authorization at Authing
    • 接入 RBAC
    • 接入 ABAC
    • 接入组织机构管理
  • 扩展能力
    • 自定义认证流程(Pipeline)
      • 创建你的第一个 Pipeline 函数
      • Pipeline 函数开发指南
      • 应用场景
      • user 对象
      • context 对象
      • 使用环境变量
      • 可用的 Node Modules
      • 如何调试
      • Node SDK
      • GraphQL API
      • 常见问题
      • 私有化部署
    • 使用 Webhook
    • 自定义用户字段
  • 开发资源
    • 开发资源
    • API(GraphQL)
    • Guard for Web
      • 自定义 Guard 的 UI 样式
    • Guard for Mobile
      • Guard for React Native
    • Guard VS 自定义 UI
    • SDK for 单点登录
    • SDK for JavaScript
      • 查询用户权限
      • 绑定社会化登录
      • 自定义用户字段
      • 管理 MFA 口令
      • 自定义请求链接
    • SDK for Node.js
      • 权限控制
      • 查询用户权限
      • 组织机构管理
      • 老版权限控制(deprecated)
      • Pipeline 函数
      • 自定义用户字段
      • 绑定社会化登录
      • 管理 MFA 口令
      • 自定义请求连接
    • SDK for React Native
    • SDK for 微信小程序
    • SDK for Java
    • SDK for Objective-C
    • SDK for Python
    • SDK for Go
    • SDK for PHP
    • 函数计算(FaaS)
  • 通信
    • 邮件
    • SMS
  • MFA
    • 配置 MFA 安全口令
      • 使用 Microsoft Authenticator 添加 MFA 令牌
    • 接入 MFA
  • 安全
    • 配置 Web 安全域
    • 配置用户池密码强度
    • 配置密码加密函数
  • 其他
    • 常见问题
    • 集成案例
      • Authing 与 AWS 集成案例
      • 函数计算与 AaaS 集成案例
      • Odoo 集成案例
      • 社会化登录集成案例
    • 社交互联数据
    • 为 Authing 贡献 SDK
      • 了解 Authing 的模块
Powered by GitBook
On this page
  • Web 端
  • 移动端
  • 用户扫码成功后

Was this helpful?

  1. 扫码登录
  2. APP 扫码登录

快速接入

APP 扫码登录是指在移动设备上扫描二维码登录 Web 网站,在 Web,Authing 还提供了相关 SDK 接口,可以帮助你快速实现一个完整的扫码登录组件。

PreviousAPP 扫码登录NextWeb 端 SDK

Last updated 5 years ago

Was this helpful?

Web 端

在 Web 端,我们推荐使用Authing 提供的 SDK。安装流程请查看 SDK for JavaScript。

安装完成后,可以新建一个 Web 项目,然后复制以下代码:

const Authing = require('authing-js-sdk');

// 初始化 Authing SDK for JavaScript
const authing = new Authing({
    userPoolId: 'your_userpool_id',
});

// 调用 APP 扫码登录的方法,此方法将生成一个用于扫码登录的图片和相关提示信息
authing.qrlogin.startScanning({
  onSuccess(data) {
    alert('扫码成功,请打开控制台查看用户信息')
    console.log(data);
    const {ticket, userInfo} = data;
    // 存储 token 到 localStorage 中
    localStorage.setItem('token', userInfo.token);
  }
})

运行后将自动生成用于 APP 扫码登录的二维码:

扫码成功之后,Authing 将会回调开发者传入的 onSuccess,回调的参数中包含了 ticket 和 userInfo,ticket 可以用来换取用户信息。

如果你想自定义 UI ,了解如何使用 ticket 换取用户信息,可以查看:

移动端

Authing 生成的二维码中包含的原始信息为一串字符串,转换为 JSON 后如下:

{
    "scene": "APP_AUTH",
    "qrcodeId": "5e05f0c57fde537d950f7da5",
    "userPoolId": "5e04ae0d5f3cee22fb37612b",
    "createdAt": "2019-12-27T11:53:41.260Z",
    "expireAt": "2019-12-27T11:55:41.260Z",
    "userDefinedData": { "hello": "world" }
}

字段含义如下:

  • scene:场景值,APP_AUTH 表示 APP 扫码登录。

  • qrcodeId:二维码 ID,移动端之后根据此 ID 完成确认扫码、同意授权、取消授权(注意,这里的“确认扫码”意思是移动端标记此二维码已经被扫描,但是用户还没有采取同意或取消操作。有关二维码的详细状态,请见完整接口列表页)

  • userPoolId:用户池 ID。

  • createdAt:二维码创建时间。

  • expireAt:二维码过期时间。

  • userDefinedData:用户自定义字段。了解如何添加自定义数据,请见完整接口列表页。

要实现 APP 扫描登录 Web 端,首先要求 APP 端用户处于登录状态(这是理所当然的),调用相关接口的时候要带上终端用户的 token。移动端一共需要用到三个接口:

  • 确认扫码

  • 同意授权

  • 取消授权

要了解这个三个接口的详情,请见完整接口列表页。

下面以 Objective-C 为例,实现同意授权登录:

  • 第 9 行在请求头带上了用户登录凭证。

- (void) ConfirmAuthorization:(NSString *) qrcodeId{    
    NSURL * api =[NSURL URLWithString:@"http://oauth.authing.cn/oauth/scan-qrcode/confirm"];
    NSDictionary *bodyDict = @{
        @"qrcodeId": qrcodeId,
    };
    NSData *body = [NSJSONSerialization dataWithJSONObject:bodyDict options:kNilOptions error:nil];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:api];
    request.HTTPMethod = @"POST";
    [request setValue:self.USER_TOKEN forHTTPHeaderField:@"Authorization"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setHTTPBody:body];
    
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
        if(httpResponse.statusCode == 200)
        {
            NSError *parseError = nil;
            NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
            NSLog(@"The response is - %@",responseDictionary);
            NSInteger code = [[responseDictionary objectForKey:@"code"] integerValue];
            if(code == 200)
            {
                NSLog(@"SUCCESS");
            }
            else
            {
                NSLog(@"FAILURE");
            }
        }
        else
        {
            NSLog(@"Network Error");
        }
    }];
    
    [dataTask resume];
}

用户扫码成功后

移动端确认授权之后,Web 将会看到相关提示。

这个时候,整个登录流程也就完成了,开发者可以使用 ticket 去换取用户信息了。

 authing.exchangeUserInfoWithTicket(ticket).then(res => {
    const { code } = res
    if (code === 200) {
      console.log("Exchange userInfo success: ", res)
    } else {
      console.log("Exchange userInfo failed: ", res)
    }
  })

返回结果示例:

{ 
   "code":200,
   "message":"换取用户信息成功",
   "data":{ 
      "_id":"5e05bbf2d51b3761d5c71070",
      "email":"983132@qq.com",
      "emailVerified":false,
      "oauth":"",
      "registerMethod":"default:username-password",
      "username":"983132@qq.com",
      "nickname":"",
      "company":"",
      "photo":"https://usercontents.authing.co/authing-avatar.png",
      "token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7ImVtYWlsIjoiOTgzMTMyQHFxLmNvbSIsImlxxxxxxxxx",
      "phone":"",
      "tokenExpiredAt":"2020-01-11T08:08:18.000Z",
      "loginsCount":1,
      "lastIP":"::1",
      "signedUp":"2019-12-27T08:08:18.115Z",
      "blocked":false,
      "isDeleted":false
   }
}

有关如何在 IOS 中扫描并解析二维码的内容,可以查看。

api 地址为:

恭喜你,此时已经接入了 App 扫码登录。获取到用户信息之后,你可以得到登录凭证 token,你可以在后续的 API 请求中携带上此 token, 然后在后端接口中根据此 token 区分不同用户,详情请见。

SDK for JavaScript
Web 端 SDK
完整接口列表
这篇文章
http://oauth.authing.cn/oauth/scan-qrcode/confirm
验证 token