plugin-oauth2
                                
                                
                                
                                    plugin-oauth2 copied to clipboard
                            
                            
                            
                        通用 OAuth 登陆错误
根据 #23 的描述进行了通用 OAuth Provider 配置,但是初次绑定时,认证完成,会被重定向到 /console/login?error(但是没有输出错误信息),且没有绑定成功。
错误状况与这个问题一样:https://github.com/halo-dev/halo/issues/3670
我尝试了以下方式进行调试:
- 配置 GitHub 认证,能够成功绑定。(说明插件本身功能没问题)
 - 使用 GitHub 的配置,新建一个 OAuth Provider,能够成功绑定。(说明 OAuth Provider 配置方法没问题)
 
由于每个 OAuth 服务器都存在一些细微差异(比如支持用户 claim 不一样),现在我怀疑的问题出现在两个地方:
- 是否成功交换了 access token
 - 是否成功获取并解析出了用户信息(
userNameAttributeName) 
我目前从 概览 - 运行日志 中没有看到任何错误提示,想请问下开发者,可以从哪里获取本插件的错误信息?
+1 我也发生了这样的问题,查看日志没有错误信息😭
更新下目前的进度。
通过添加 issuerUri 和 jwkSetUri 参数,应该是成功跑通了流程。(具体还没搞清楚)
但是目前出现了 400 报错 #14,错误信息如下:
Validation error(s) : spec: Field 'displayName' is required. (code: 1026) From: spec.<#/components/schemas/UserConnectionSpec>.
of schema auth.halo.run/v1alpha1/UserConnection. 
目前定位原因是我的 IdP 不支持返回 name 这个属性。想请问下开发者,应该如何配置,以使用其他的 IdP 返回属性(比如 username),映射到 displayName 参数上。
更新下目前的进度。
通过添加
issuerUri和jwkSetUri参数,应该是成功跑通了流程。(具体还没搞清楚)但是目前出现了 400 报错 #14,错误信息如下:
Validation error(s) : spec: Field 'displayName' is required. (code: 1026) From: spec.<#/components/schemas/UserConnectionSpec>. of schema auth.halo.run/v1alpha1/UserConnection.
目前定位原因是我的 IdP 不支持返回
name这个属性。想请问下开发者,应该如何配置,以使用其他的 IdP 返回属性(比如username),映射到 displayName 参数上。
cc @liuchangfitcloud
已经定位到相关代码:
https://github.com/halo-sigs/plugin-oauth2/blob/f7b1401e98f8b635846f3e2e84f102ca47cdad77/src/main/java/run/halo/oauth/GenericUserProfileMapper.java#L19
通过修改 GenericUserProfileMapper.java 文件,已经可以成功设置 displayName:
import java.util.Optional;
public Oauth2UserProfile mapProfile(OAuth2User oauth2User) {
    String displayName = (String) Optional.ofNullable(oauth2User.getAttribute("username"))
    .orElse(oauth2User.getAttribute("name"));
    return Oauth2UserProfile.builder()
        .displayName(displayName)
        .username(oauth2User.getAttribute("login"))
        .avatarUrl(oauth2User.getAttribute("avatar_url"))
        .profileUrl(oauth2User.getAttribute("html_url"))
        .build();
}
建议开发者之后,可以在 Oauth2ClientRegistration 配置文件中,添加一个新的参数,支持自定义将 OAuth 协议中用户属性映射成 displayName 参数(类似 userNameAttributeName 映射 username)。
另外也建议开发者可以提供下错误日志记录功能,我想排查不添加 issuerUri 和 jwkSetUri 参数报错的原因。谢谢!
+1 我也发生了这样的问题,没有异常日志 第三方的auth code生成返回了, 回调地址没响应
再次更新: 通过抓包工具分析,获取code, 通过code获取access_token, 再通过token获取user已经完成,不过界面还是会被重定向到 /console/login?error,不解
+1 我也发生了这样的问题,没有异常日志 第三方的auth code生成返回了, 回调地址没响应
再次更新: 通过抓包工具分析,获取code, 通过code获取access_token, 再通过token获取user已经完成,不过界面还是会被重定向到 /console/login?error,不解
问题任然存在
see #57