Tencent / CodeAnalysis

Static Code Analysis - 静态代码分析
https://tencent.github.io/CodeAnalysis
Other
1.62k stars 277 forks source link

【技术支持】集成OIDC一键登录协议 #830

Open ontheway01 opened 1 year ago

ontheway01 commented 1 year ago

描述

正在针对源代码进行二次开发,涉及Login服务 server/projects/login相关后端代码,计划通过引入oidc协议python包支持一键登录。 已完成示例简单项目的集成,在与TCA登录中对于路由、视图存在一些问题,比如server/projects/login/login/urls/v3.pyserver/projects/login/login/apis/v3.py中如何串联起来

"""
login - v3 urls
"""
from django.urls import path

from login.apis import v3 as apis_v3

urlpatterns = [
    # 用户信息
    path("users/", apis_v3.UserListAPIView.as_view(), name="apiv3_user_list"),
    path("user/", apis_v3.TokenUserDetailAPIView.as_view(), name="apiv3_user_token_detail"),
    path("users/<uid>/", apis_v3.UserDetailAPIView.as_view(), name="apiv3_user_detail"),
    path("get_oapassword_info/", apis_v3.OAInfoAPIView.as_view(), name="apiv3_oapssword_info"),
    # 账号关联,解绑
    path("account/", apis_v3.AccountInfoAPIView.as_view(), name="apiv3_account_info"),
    # OIDC第三方账号登录
    path('oauth2/callback/oidc/', apis_v3.OIDCUserAPIView.as_view(), name='apiv3_user_oidc_auth'),
]
class OIDCUserAPIView(TokenObtainPairView):
    """OIDC协议第三方登录接口
    """
    serializer_class = serializers.UserTokenObtainPairSerializer
    throttle_classes = (ScopedRateThrottle,)
    throttle_scope = "get_userinfo"

    def post(self, request, *args, **kwargs):
        try:
            data = request.data
            # id_token
            token = oauth.oidc.authorize_access_token(request)
            if token:
                identifier = token['userinfo']['sub']
                params = {}
                logger.debug("Current Login User: %s" % identifier)
                params["isRegister"] = True
            else:
                raise NotAuthenticated("解析id_token失败")
        except Exception as e:
            logger.exception("OIDC登录失败: %s" % e)
            raise ParseError("登录失败,OIDC配置错误")
        return Response(params)

需支持

协助讨论登录功能的流程,以及路由和api文件中v1和v3的配置区别

ontheway01 commented 1 year ago

更新:目前遇到了tca通过源代码方式部署后前端和后端更新了,但是前端页面点击“一键登录”按钮无法跳转到SSO服务器页面中。 需技术支持:登录时如何跳转到SSO服务器,是否nginx需配置

ontheway01 commented 12 months ago

更新:目前遇到了tca通过源代码方式部署后前端和后端更新了,但是前端页面点击“一键登录”按钮无法跳转到SSO服务器页面中。 需技术支持:登录时如何跳转到SSO服务器,是否nginx需配置

已解决。

原因分析:后端认证返回code 302,前端因为跨域访问问题无法从tca部署的服务器跳转SSO服务器。解决方式:后端修改返回code为200后,前端根据反馈的SSO的地址新建一个窗口页面

ontheway01 commented 12 months ago

新问题:TCA和SSO(OKTA提供认证服务)完成授权后,TCA登录时出现异常,现象为前端页面先提示“登录成功”,再提示“登录态已过期,重新登录系统!'” 已查看后端日志,SSO登录和正常登录无明显报错信息参考。 后端修改内容:server/projects/login/login 前端修改内容:web/packages/login/src/modules

"GET /oauth2/v1/keys HTTP/1.1" 200 None -2023-07-08 14:45:12,677-DEBUG-root: token['userinfo']: -2023-07-08 14:45:12,677-DEBUG-login.apis.v3: OIDC Current userinfo['name']: Hao Pan -2023-07-08 18:40:12,034-WARNING-login.middleware.loginmiddleware: [auth_type: Oauth] auth type not in authorization -2023-07-08 18:40:12,037-WARNING-django.request: Unauthorized: /api/v3/login/user/