第三方登录的原理_第三方授权登录的实现

第三方登录的原理_第三方授权登录的实现一、什么是第三方登录? 简单来讲,就是用户可以通过已有网站或应用的账号,登录我们自己的应用;如常见的QQ,微信,微博;效果是,如果不想在我们应用再次注册账户,直接使用QQ,微信,微博等平台账户就可以。

一、什么是第三方登录?

简单来讲,就是用户可以通过已有网站或应用的账号,登录我们自己的应用;如常见的QQ,微信,微博;效果是,如果不需要在我们应用再次注册账户,直接使用QQ,微信,微博等平台账户就可以登录我们的应用。 如图:

截屏2022-03-05 下午3.26.22.png

第三方登录解决了什么问题?

降低用户使用产品的门槛;因为,注册和登录,确实是一个比较麻烦的事情。

二、原理

基本原理:

当用户点击第三方登录时,会跳转到第三方登录SDK内部;用户输入第三方登录用户名或密码,有些第三方登录平台,可以直接调用已经登录的账号,例如:QQ;完成第三方平台登录的;登录完成后,第三方平台,或者SDK会回调我们的应用,在回调的信息里面,可以拿到用户在第三方平台的OpenId,以及昵称,头像等信息。

详细流程如下:

未命名绘图.jpg

(A)用户打开客户端以后,客户端要求用户给予授权。
(B)用户同意给予客户端授权。
(C)客户端使用上一步获得的授权,向认证服务器申请令牌。
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(E)客户端使用令牌,向资源服务器申请获取资源。
(F)资源服务器确认令牌无误,同意向客户端开放资源

更仔细的原理学习,请参考下链,本文着重应用层面的实现流程
OAuth 2 深入介绍
OAuth 2 Simplified • Aaron Parecki

三、实现流程

基本顺序.jpg

1、到各第三方服务平台中创建应用

这一步,几乎是所有集成第三方服务需要的步骤。

根据不同的平台,不同的服务,提供的信息也不一样,可能需要提供,用户名称,应用类型,应用平台(iOS,Android,Web),BundleId等信息,以下用接入QQ登录服务为例讲解

1)进入qq开放者平台,接入应用应用

qq开放平台.png

2)开始创建,进入创建页面,点击“创建应用”
注意:首次使用一般要认证身份,自行认证一下就行 身份信息.png

3)接下来填写安装包名及签名信息即可,提交后等待审核,此时也=就已经可以调用登录接口,只是有一些限制,通过审核后就完全可调用,一般3天内

4)审核通过后如图: 审核通过.png

5)点击查看,获取APP ID和 APP Key:
这两个信息在集成SDK时要用 appInfo.png

2、获取应用信息

从上面的5)可获取

3、客户端集成SDK

这里使用的是ShareSDK,因为:

  1. 聚合了很多第三方平台,包括QQ,微信,微博,支付宝等;
  2. 可以实现分享,第三方登录等功能。
  3. 对外提供统一的登录,分享接口;他屏蔽了不同SDK之间的API差异,这里使用它就可以更加轻松的集成QQ,微信,微博,支付宝等平台了。

虽然前面在QQ创建了应用,但由于用到了ShareSDK,他也是一个第三方服务,所以也要创建应用,同样最终是要获取到AppKey这样的信息,过程和QQ差不多,这里不再赘述

SharedSDK执行时序图(底层原理还是上面上面说的OAuth2):

162467485989765.12.png

完整集成步骤:MobTech集成文档-MobTech

4、初始化SDK

初始化SDK.png

4、业务调用SDK接口,实现三方登录

下述代码以点击登录按钮,实现三方QQ登录为例:

public void onQQLoginClick() {
    //初始化具体的平台
    Platform platform = ShareSDK.getPlatform(QQ.NAME);

    //设置false表示使用SSO授权方式
    platform.SSOSetting(false);

    //回调信息
    //可以在这里获取基本的授权返回的信息
    platform.setPlatformActionListener(new PlatformActionListener() {
        /** * 登录成功了 * @param platform * @param i * @param hashMap */
        @Override
        public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
            //登录成功了

            //就可以获取到昵称,头像,OpenId
            //该方法回调不是在主线程

            //从数据库获取信息
            //也可以通过user参数获取
            PlatformDb db = platform.getDb();

            data = new User();

            PlatformDb db = platform.getDb();
            String nickname = db.getUserName();
            String avatar = db.getUserIcon();
            String openId = db.getUserId();

            LogUtil.d(TAG, "other login success:" + nickname + "," + avatar + "," + openId + "," + HandlerUtil.isMainThread());
        }

        /** * 登录失败了 * @param platform * @param i * @param throwable */
        @Override
        public void onError(Platform platform, int i, Throwable throwable) {
            LogUtil.d(TAG, "other login error:" + throwable.getLocalizedMessage() + "," + HandlerUtil.isMainThread());
        }

        /** * 取消登录了 * @param platform * @param i */
        @Override
        public void onCancel(Platform platform, int i) {
            LogUtil.d(TAG, "other login cancel:" + i + "," + HandlerUtil.isMainThread());
        }
    });

    //authorize与showUser单独调用一个即可
    //授权并获取用户信息
    platform.showUser(null);
}

这样,就已经达到三方登录的目的了,咱们可以根据拿到的三方应用应用信息,展示到我们对应的客户端上

其他接口说明:

其他接口说吗.png

注意:

这只是走通三方登录的流程,在上线的项目中,流程会更加复杂,比如:
往往需要后台的登录接口,判断是否登录成功,如果成功,则表示这个用户已经补充了资料(也可以理解为已经注
册了);如果返回“用户不存在”,则表示这个用户还没有注册,客户端跳转到补充用户资料界面,补充完成后,
调用用户注册逻辑,注册成功后,调用登录逻辑

大家可自行根据业务场景去细化,融会贯通

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13270.html

(0)

相关推荐

  • atlas开源_apache atlas docker

    atlas开源_apache atlas dockerApache Atlas 架构设计及源代码分析, 以Hive建库为例,分析元数据采集的主体流程

    2023-04-22
    106
  • Python中使用元组进行不可变序列操作

    Python中使用元组进行不可变序列操作元组(Tuple)是Python中的一种不可变类型序列,用于存储一组数据。元组的创建方式与列表相似,用小括号 “( )” 将元素括起来,多个元素之间用逗号 “,” 隔开。虽然元组和列表都是序列类型,但元组不可变的特性使其在某些场景下具有优势,尤其是在保证数据不被修改的情况下,可以提高代码的安全性和效率。

    2023-12-06
    66
  • Mysql8.0习题系列(五):子查询(一篇搞懂子查询做题技巧,超详细)

    Mysql8.0习题系列(五):子查询(一篇搞懂子查询做题技巧,超详细)本文已参与「新人创作礼」活动,一起开启掘金创作之路 Mysql8.0习题系列 软件下载地址 提取码:7v7u 数据下载地址 提取码:e6p9 子查询 1.查询和Zlotkey相同部门的员工姓名和工资

    2023-07-23
    87
  • 数据库—约束「终于解决」

    数据库—约束「终于解决」 一、概述 创建表的时候可以给表中的数据添加数据校验规则,这些规则称之为约束。 在创建表的时候,同时可以指定所插入数据的一些规则,比如某个字段不能为空值; 某个字段的值(比如年龄)不能小于零等…

    2023-03-22
    90
  • PgSQL中修改数据自动更新update_time[通俗易懂]

    PgSQL中修改数据自动更新update_time[通俗易懂] — 创建函数CREATE OR REPLACE FUNCTION “upd_timestamp”()RETURNS TRIGGER AS $$BEGIN NEW.update_time =…

    2023-03-26
    127
  • Mysql访问中间件–Atlas初探

    Mysql访问中间件–Atlas初探Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bu…

    2022-12-23
    104
  • MySQL连接查询INNER JOIN、LEFT JOIN、RIGHT JOIN「建议收藏」

    MySQL连接查询INNER JOIN、LEFT JOIN、RIGHT JOIN「建议收藏」一、内连接(INNER JOIN) 获取两个表中字段匹配关系的记录,需要两个表都满足条件的数据才会返回。如下图阴影部分所示区域。 实例:有一张表table_a,数据如下: 表table_b,数据如下:

    2023-02-24
    108
  • Python Dictionary:高效快速地存储和检索数据

    Python Dictionary:高效快速地存储和检索数据Python是一种高级编程语言,以简单、易读易写的代码著称,并且有着大量的支持性库。其中,Dictionary是Python中非常重要的数据结构之一,是一种key-value存储方式,提供了高效快速的数据存储和检索方法。Python里面的Dictionary类似于Java中的Map,或C++中的unordered_map。

    2024-03-30
    27

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注