
OAuth2 应用实践:Directus集成钉钉登录的尝试
1. 项目简介 这个小项目预期结果是让 Directus 支持使用钉钉账号来登录。 在了解OAuth2协议后(参见上一篇blog,参考资料1),已经有足够知识储备来实施。 Directus 原生支持使用GitHub登录, 所以,解决思路是先从GitHub入手。按下面步骤进行: 配置Directus使用GitHub账号登录,熟悉Directus对OAuth的标准支持功能 配置Directus使用钉钉账号登录,由于钉钉的协议实现和RFC6749/GitHub有不同,这里有可能需要见招拆招 上线Directus到服务器环境,在钉钉的PC版和手机版验证 2. 环境配置 在本地用ngrok暴漏出一个服务,来接受OAuth服务器的redirect。 ngrok http 8055 得到 https://445a-240e-47c-30b0-3b10-600e-ea25-cde5-2334.ngrok.io/ 作为外网域名来访问本机8055端口的directus。 3. Directus 使用 GitHub账号登录 按参考资料2中配置参数。以下配置中,对每一个新的GitHub授权用户,Directus在登录过程中会使用用户email自动创建一个Directus用户,并且将其角色赋值为AUTH_GITHUB_DEFAULT_ROLE_ID。 AUTH_PROVIDERS="github" AUTH_GITHUB_DRIVER="oauth2" AUTH_GITHUB_CLIENT_ID="7e....ae" AUTH_GITHUB_CLIENT_SECRET="d5.......d9" AUTH_GITHUB_AUTHORIZE_URL="https://github.com/login/oauth/authorize" AUTH_GITHUB_ACCESS_URL="https://github.com/login/oauth/access_token" AUTH_GITHUB_PROFILE_URL="https://api.github.com/user" AUTH_GITHUB_ALLOW_PUBLIC_REGISTRATION="true" AUTH_GITHUB_DEFAULT_ROLE_ID="0f5f1b5a-106f-4ec7-a8b8-6f11482a060f" AUTH_GITHUB_ICON="github" # AUTH_GITHUB_EMAIL_KEY="email" # AUTH_GITHUB_IDENTIFIER_KEY="email" 重启Directus让配置生效后,可以看到登录界面的GitHub选项。 选择授权后,成功登录Directus。 检查Directus中新生成的用户和权限正常。 4. Directus 使用钉钉账号登录的尝试 先照猫画虎配置下。 AUTH_PROVIDERS="github, dingtalk" ... ... AUTH_DINGTALK_DRIVER="oauth2" AUTH_DINGTALK_CLIENT_ID="ding...txt" AUTH_DINGTALK_CLIENT_SECRET="c6rCT...h4ohKlq5oz" AUTH_DINGTALK_AUTHORIZE_URL="https://login.dingtalk.com/oauth2/auth" AUTH_DINGTALK_ACCESS_URL="https://api.dingtalk.com/v1.0/oauth2/userAccessToken" AUTH_DINGTALK_PROFILE_URL="https://api.dingtalk.com/v1.0/contact/users/me" AUTH_DINGTALK_ALLOW_PUBLIC_REGISTRATION="true" AUTH_DINGTALK_DEFAULT_ROLE_ID="0f5f1b5a-106f-4ec7-a8b8-6f11482a060f" AUTH_DINGTALK_ICON="alipay" #AUTH_DINGTALK_EMAIL_KEY="email" #AUTH_DINGTALK_IDENTIFIER_KEY="email" 点击Log In with Dingtalk可以正常授权, 但授权后被redirect到了 /admin/login?reason=INVALID_USER 怀疑是钉钉重定向回来的链接没有code参数(参见上一篇协议解析,钉钉是用的authCode参数),第一时间先在社区开个issue看看有没有其他人碰到过。 同时,对oauth2的driver做了一个临时补丁, 当有authCode时候, 就把authCode赋值给code。 ...
