Authing 文档
文档
快速开始
概念
使用指南
开发集成
应用集成
加入 APN
多租户(内测版)
旧版
快速开始
概念
使用指南
开发集成
应用集成
加入 APN
多租户(内测版)
旧版
开发集成
  • 登录组件 (Guard)
  • 单点登录(SSO)
  • JavaScript / Node.js
  • Java / Kotlin
  • Python
  • C#
  • PHP
  • Go
  • Ruby
  • Android
  • iOS
    • 开始开发
    • 快速接入
    • 超组件
    • APIs

      • 核心认证 API
      • 标准协议 API
      • 多因素认证 API
      • 扫码认证 API
      • 工具类 API
    • 社会化登录
    • 私有化部署
  • Swift
  • Flutter
  • React Native
  • 微信小程序
  • 微信网页授权
  • 框架集成
  • 错误代码

    ¶ 标准协议 API

    更新时间: 2022-03-22 10:58:40

    ¶ 生成 OIDC 协议的用户登录链接

    生成登录 URL,传给 WebView 加载

    static func buildAuthorizeUrl(authRequest: AuthRequest, completion: @escaping (URL?) -> Void)
    

    参数

    • authRequest 请求参数

    示例

    let authRequest = AuthRequest()
    OIDCClient.buildAuthorizeUrl(authRequest: authRequest) { url in
        if url != nil {
            // self is your view controller
            // webView is a WKWebView object
            self.webView?.load(URLRequest(url: url!))
        }
    }
    

    设置 scope 参数

    默认值为 openid profile email phone username address offline_access role extended_fields

    authRequest.scope = "openid"
    

    设置回调参数

    SDK 会自动获取控制台默认回调。如果在控制台修改了回调,则需要设置 authRequest 回调地址。

    authRequest.redirect_uri = "your_uri"
    

    ¶ code 换 token

    通过 OIDC 授权码认证,返回的 UserInfo 里面包含 access token 和 id token。如果登录 url 的 scope 里面包含 offline_access,则该接口也会返回 refresh token

    static func authByCode(code: String, authRequest: AuthRequest, completion: @escaping(Int, String?, UserInfo?) -> Void)
    

    参数

    • code OIDC 授权码。通过 webview 的回调获取
    • authRequest 请求参数。

    示例

    通过实现 WKNavigationDelegate 协议回调函数获取授权码,然后通过授权码完成认证

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        guard let url = navigationAction.request.url,
                url.absoluteString.hasPrefix(authRequest.redirect_uri) == true else {
            decisionHandler(.allow)
            return
        }
        
        if let authCode = Util.getQueryStringParameter(url: url, param: "code") {
            OIDCClient.authByCode(code: authCode, authRequest: authRequest) { code, message, userInfo in
                if (code == 200) {
                    
                }
            }
        }
        decisionHandler(.cancel)
    }
    

    ¶ OIDC 协议账号密码登陆

    通过 OIDC 账号密码登录,返回的 UserInfo 里面包含 access token , id token 和 refresh token。

    public static func loginByAccount(account: String, password: String, completion: @escaping(Int, String?, UserInfo?) -> Void)
    

    参数

    • account 账号
    • password 密码

    示例

    OIDCClient.loginByAccount(account: account, password: password) { code,  message,  userInfo in
        print("\(userInfo?.accessToken ?? "")")
        print("\(userInfo?.idToken ?? "")")
        print("\(userInfo?.refreshToken ?? "")")
    }
    

    ¶ OIDC 协议手机号验证码登陆

    通过 OIDC 手机号验证码登录,需要先调用 发送短信验证码 (opens new window) 接口。返回的 UserInfo 里面包含 access token , id token 和 refresh token。

    public static func loginByPhoneCode(phone: String, code: String, completion: @escaping(Int, String?, UserInfo?) -> Void)
    

    参数

    • phone 手机号
    • code 验证码

    示例

    OIDCClient.loginByPhoneCode(phone: phone, code: code) { code, message, userInfo in
        print("\(userInfo?.accessToken ?? "")")
        print("\(userInfo?.idToken ?? "")")
        print("\(userInfo?.refreshToken ?? "")")
    }
    

    ¶ 获取用户信息

    通过 access token 获取用户信息。返回的 userInfo 对像和参数传入的是同一个 userInfo 对象

    static func getUserInfoByAccessToken(userInfo: UserInfo?, completion: @escaping(Int, String?, UserInfo?) -> Void)
    

    参数

    • userInfo 包含 access token 的用户信息

    示例

    OIDCClient.getUserInfoByAccessToken(userInfo: userInfo) { code, message, data in
        if (code == 200) {
            // data 为更新了用户信息的 UserInfo 对象,和参数是同一个对象
        }
    }
    

    ¶ 通过 refresh token 获取新的 access token 和 id token

    access token 的有效期通常较短,比如几个小时或者 1 天。当 access token 过期后,App 不能频繁的弹出登录界面让用户认证,那样体验比较糟糕。所以通常的做法是通过代码,用一个有效期比较长的 refresh token 去刷新 access token,从而保持登录状态。只有当 refresh token 过期才弹出登录界面。

    static func getNewAccessTokenByRefreshToken(userInfo: UserInfo?, completion: @escaping(Int, String?, UserInfo?) -> Void)
    

    参数

    • refreshToken 刷新凭证。注意登录 URL 里面的参数配置,请参考 “生成 OIDC 协议的用户登录链接”

    示例

    OIDCClient.getNewAccessTokenByRefreshToken(userInfo: userInfo) { code, message, userInfo in
        if (code == 200) {
            
        }
        self.goHome()
    }
    OIDCClient.getNewAccessTokenByRefreshToken(userInfo: userInfo) { code, message, userInfo in
        print("\(userInfo?.accessToken ?? "")")
        print("\(userInfo?.idToken ?? "")")
        print("\(userInfo?.refreshToken ?? "")")
    }
    

    注意,每次调用会得到新的 refresh token


    上一篇: 核心认证 API 下一篇: 多因素认证 API

    本文是否有解决您的问题?

    如果遇到其他问题,你可以在 authing-chat/community 联系我们。

    • 生成 OIDC 协议的用户登录链接
    • code 换 token
    • OIDC 协议账号密码登陆
    • OIDC 协议手机号验证码登陆
    • 获取用户信息
    • 通过 refresh token 获取新的 access token 和 id token

    用户身份管理

    集成第三方登录
    手机号闪验 (opens new window)
    通用登录表单组件
    自定义认证流程

    企业内部管理

    单点登录
    多因素认证
    权限管理

    开发者

    开发文档
    框架集成
    博客 (opens new window)
    GitHub (opens new window)
    社区用户中心 (opens new window)

    公司

    服务状态
    15559944612
    sales@authing.cn
    北京市朝阳区北辰世纪中心 B 座 16 层(总)
    成都市高新区天府五街 200 号 1 号楼 B 区 4 楼 406 室(分)

    京ICP备19051205号

    beian京公网安备 11010802035968号

    © 北京蒸汽记忆科技有限公司