拡張可能なログイン機能を設計する方法

この記事では主に、拡張可能なログイン機能を設計する方法を説明します。

1. 複数のログイン方法 (さまざまなログイン方法をバインドするには一意の値が必要です。現在、業界では主に携帯電話番号が使用されています)

1. ユーザー名+パスワードでログイン

最も独創的なログイン方法であり、登録機能とは別のログイン方法であり、業界では徐々にこの方法を放棄してきました。

2. 携帯電話番号+ログイン認証コード

業界のほとんどで使用されているログイン方法は、このログイン方法と登録機能が統合されていますが、この方法には SMS 認証コードの取得のエクスペリエンスに問題があります。

3. 市内番号でワンクリックログイン

方法 2 の最適化に基づいて、ログイン エクスペリエンスを最大化できます

4. サードパーティの承認されたログイン (WeChat、Weibo、QQ など)

ログイン方法の最適化により、ログイン エクスペリエンスは方法 3 と同じになります。ここでの認証とは、WeChat、Weibo、QQ などのサードパーティ プラットフォームでログインを認証するときに取得されるコードを指します。このコードにサードパーティ プラットフォームのユーザー情報 (openid、unionid など) を取得できます。

5. 携帯電話番号 + 認証コードによるログイン + サードパーティ認証のバインディング

方法 4 の補足として、通常は方法 4 が完了したときに実行されます。通常、認証してログインした後は、ユーザーがすでにアカウントを持っているかどうかは不明であり、固有の値を検証するために携帯電話番号を入力する必要があります。

2. マイクロサービスで認証サービスを設計し、上記のログイン方法を認証サービスで統一する

1. C側APIは、ユーザーログイン後にアクセスできるものと、ログインせずにアクセスできるものに大別されます。

2. リクエストにトークンがない場合はログインする必要がありますが、トークンがある場合は必ずしもログインしている必要はなく、トークンが無効である可能性があります。

3. トークンを持っている場合は、ゲートウェイで統一処理を行い、トークンを解析して内部のユーザー ID (トークンの生成時に設定される) を取得し、マイクロサービス内で渡すヘッダーに設定します。 、ヘッダーには設定しないでください

4. BFF層のマイクロサービスは、ヘッダーでユーザーIDが取得できるかどうかでユーザーがログインしているかどうかを判断し、ログインが必要なアクセスでユーザーIDを持たないAPIの場合は、エラー コードを修正し、フロントエンドの同僚とエラーに対応することに同意します。ログインをガイドするコード

5. ログイン要求は認証サービスに転送され、登録/ログインが統合され、応答トークンがフロントエンドに送信され、フロントエンドでトークンがローカルに保存され、後続のすべての要求でトークンが送信されます。

3. コアコード

1. ログインインターフェースコード

2. トークンを解析してユーザー ID を取得し、それをヘッダーに設定します

3. ヘッダーにユーザーIDがあるかどうかに応じて、APIへのログインが必要です

4. ストレージテーブルの構造

CREATE TABLE `bu_user_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `nickname` varchar(32) DEFAULT NULL COMMENT '昵称',
  `avator` varchar(32) DEFAULT NULL COMMENT '头像',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
CREATE TABLE `bu_user_oauth` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `user_id` int(11) NOT NULL COMMENT 'bu_user_info.id',
  `identity_type` varchar(32) NOT NULL COMMENT '账号类型(mobile:手机号,wx-unionid:微信unionid,wx-openid-miniapp:微信小程序openid,wx-openid-mp:微信公众号openid,email:邮箱,username:用户名,sina:新浪微博,qq:QQ)',
  `identifier` varchar(32) NOT NULL COMMENT '手机号、邮箱、用户名或第三方应用的唯一标识',
  `certificate` varchar(255) DEFAULT NULL COMMENT '凭证(站内的保存密码,站外的不保存或保存token)',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uniq_ui_it` (`user_id`,`identity_type`),
  UNIQUE KEY `uniq_identifier_it` (`identifier`,`identity_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户认证表';

どうでしょうか?便利だと思ったら、ぜひ集めてください。

添付ファイル: 関連するコード ディレクトリ

github:GitHub - 897665787/springcloud-template

gitee: springcloud-template: springcloud netflix に基づくマイクロサービス フレームワークで、マイクロサービス開発に最適なアプリケーションのいくつかを記録します。学習とガイドへようこそ。

springcloud-template
└── template-auth
     └── authentication
          └── LoginService -- 登录抽象定义
               └── AppWeixinService -- APP微信授权登录
               └── LocalMobileService -- 本机号码一键登录
               └── MobileCodeBindService -- 手机号+验证码登录并绑定授权码
               └── MobileCodeService -- 手机号+验证码登录
               └── UsernamePasswordService -- 用户名+密码登录
               └── WeixinMiniappService -- 微信小程序登录
               └── WeixinMpService -- 微信公众号登录
          └── LoginType -- 多种登录方式定义
     └── controller
          └── AccountController -- 登录API
     └── token
          └── TokenService -- token抽象定义
└── template-framework-edge
     └── interceptor
          └── AccessControlConfigurer
          └── AccessControlInterceptor -- 根据header有无用户ID拦截需登录API
└── template-zuul或template-gateway
     └── filter
          └── TokenFilter -- 解析token获取用户ID并将设置到header

おすすめ

転載: blog.csdn.net/w13528476101/article/details/126907433