Expo Electron OAuth2 登录

Posted

技术标签:

【中文标题】Expo Electron OAuth2 登录【英文标题】:Expo Electron OAuth2 Login 【发布时间】:2021-10-26 12:09:31 【问题描述】:

我正在尝试使用 Expo 为多个不同平台构建一个应用程序,包括桌面 - 使用 Electron。 现在我在继续记录过程直到结束时遇到问题。

我知道 Electron 使用 Expo React Native Web Features,但我不明白如何在重定向后继续记录过程。

这是我尝试过的:


const useProxy = Platform.OS !== 'web';

export function AuthScreen() 
const nextState = useAuth();

    const discovery = AuthSession.useAutoDiscovery('https://my-open-id.url');

    const redirectUri = AuthSession.makeRedirectUri(
        useProxy,
    );

    // Create and load an auth request
    const [request, , promptAsync] = AuthSession.useAuthRequest(
        
            clientId: 'client-id',
            clientSecret: 'client-secret',
            redirectUri,
            scopes: ['openid', 'profile', 'email', 'offline_access'],
        ,
        discovery
    );

    const login = useCallback(async () => 
        const result = await promptAsync(useProxy);
        console.log(result);

        if (!result) 
            return;
        

        switch (result.type) 
            case "cancel":
            case "dismiss":
                return;
            case "error":
                return;
            case "locked":
                return;
            case "success":
                const token = result.authentication;
                nextState(token);
                return;
        
    , [promptAsync]);

    if (Platform.OS !== 'web') 
        useEffect(() => 
            WebBrowser.warmUpAsync();
            return () => 
                WebBrowser.coolDownAsync();
            
        , []);
    

    return (
        <View style=flex: 1, alignItems: 'center', justifyContent: 'center'>
            <Text>Auth Screen</Text>
            <Button title="Login!" disabled=!request onPress=login/>
        </View>
    );

每当我点击 Login 按钮时,我都会被重定向到我的 OAuth2 服务器并且我可以登录。之后,我应该被重定向到我的应用程序,但没有。

在登录过程之后,新窗口仍然存在,并且应用程序的另一个实例继续存在。

我也在寻找电子功能,以了解如何充分破解它,以便拥有完整的工作流程,但我仍然不知道如何从代码的 react 本机部分访问电子的主进程。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

Expo 使用Private URI Scheme 来监听登录响应,所以首先确保您已按照文档正确注册。

接收深层链接

一旦您知道了您的应用的方案,一个简单的测试方法就是通过这样的命令,具体取决于是在 Mac 还是 Windows 上运行:

open x-mycompany-desktopapp:/somepath
start x-mycompany-desktopapp:/somepath

按照RFC8252 中的建议,我会确保在系统浏览器中登录。避免在 React Native 窗口上登录。

在浏览器中,您应该会看到向应用返回登录响应的提示。在我的blog post 中有一些屏幕截图,用于简单的 Electron OAuth 安全应用程序。

电子多实例逻辑

我的 Electron OAuth desktop code sample 使用私有 URI 方案并处理您提到的多实例问题 - 请参阅 this code 和 requestSingleInstanceLock 的使用。

希望这些笔记能给你一些线索和可能的行动。当我开发这个时,一个重要的里程碑是能够从我的main.ts 源文件中捕获日志语句!

OAuth 在 UI 中实现起来很棘手,有时诸如 Expo 之类的更高级别的技术可以让您获得很少的可见性。

【讨论】:

以上是关于Expo Electron OAuth2 登录的主要内容,如果未能解决你的问题,请参考以下文章

未找到访问令牌受众中的 OAuth2 客户端 ID

对于某些版本的 Android,FB 登录的 Expo AuthSession 不会重定向到 expo App

Expo 与 Google 登录的集成

为啥我的函数不会打开 React Native (Expo) 的 Facebook 登录页面?

Expo-ios / facebook登录不起作用独立应用程序

Apple 登录(使用 Firebase 和 Expo)在本地工作,但不能独立运行