Flutter LinkedIn登录插件linkedin_login的使用

Flutter LinkedIn登录插件linkedin_login的使用

简介

linkedin_login 是一个用于Flutter应用程序实现LinkedIn OAuth 2.0 API的库。它允许开发者轻松地集成LinkedIn登录功能,获取用户信息,并处理OAuth授权流程。

Codacy Badge

安装

请参阅 pub.dev上的安装说明

重要提示

在使用此库之前,请确保替换以下值:

final String redirectUrl = 'YOUR-REDIRECT-URL';
final String clientId = 'YOUR-CLIENT-ID';
final String clientSecret = 'YOUR-CLIENT-SECRET';

注意:clientSecret 字段仅在 LinkedInUserWidget 中需要。

示例代码

下面是一个完整的示例demo,展示了如何使用 linkedin_login 插件进行LinkedIn登录和获取用户信息。

main.dart

import 'package:flutter/material.dart';
import 'package:linkedin_login/linkedin_login.dart';

// @TODO IMPORTANT - you need to change variable values below
// You need to add your own data from LinkedIn application
// From: https://www.linkedin.com/developers/
// Please read step 1 from this link https://developer.linkedin.com/docs/oauth2
const String redirectUrl = 'https://your-app/callback'; // 替换为你的回调URL
const String clientId = 'YOUR_CLIENT_ID'; // 替换为你的客户端ID
const String clientSecret = 'YOUR_CLIENT_SECRET'; // 替换为你的客户端密钥

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter LinkedIn demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: DefaultTabController(
        length: 2,
        child: Scaffold(
          appBar: AppBar(
            bottom: const TabBar(
              tabs: [
                Tab(icon: Icon(Icons.person), text: 'Profile'),
                Tab(icon: Icon(Icons.text_fields), text: 'Auth code'),
              ],
            ),
            title: const Text('LinkedIn Authorization'),
          ),
          body: const TabBarView(
            children: [
              LinkedInProfileExamplePage(),
              LinkedInAuthCodeExamplePage(),
            ],
          ),
        ),
      ),
    );
  }
}

class LinkedInProfileExamplePage extends StatefulWidget {
  const LinkedInProfileExamplePage({super.key});

  @override
  State createState() => _LinkedInProfileExamplePageState();
}

class _LinkedInProfileExamplePageState extends State<LinkedInProfileExamplePage> {
  UserObject? user;
  bool logoutUser = false;

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: <Widget>[
          LinkedInButtonStandardWidget(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute<void>(
                  builder: (BuildContext context) => LinkedInUserWidget(
                    appBar: AppBar(
                      title: const Text('OAuth User'),
                    ),
                    destroySession: logoutUser,
                    redirectUrl: redirectUrl,
                    clientId: clientId,
                    clientSecret: clientSecret,
                    onError: (UserFailedAction e) {
                      print('Error: ${e.toString()}');
                      print('Error: ${e.stackTrace.toString()}');
                    },
                    onGetUserProfile: (UserSucceededAction linkedInUser) {
                      print('Access token ${linkedInUser.user.token}');
                      print('User sub: ${linkedInUser.user.sub}');

                      user = UserObject(
                        firstName: linkedInUser.user.givenName,
                        lastName: linkedInUser.user.familyName,
                        email: linkedInUser.user.email,
                        profileImageUrl: linkedInUser.user.picture,
                      );

                      setState(() {
                        logoutUser = false;
                      });

                      Navigator.pop(context);
                    },
                  ),
                  fullscreenDialog: true,
                ),
              );
            },
          ),
          LinkedInButtonStandardWidget(
            onTap: () {
              setState(() {
                user = null;
                logoutUser = true;
              });
            },
            buttonText: 'Logout',
          ),
          Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('First: ${user?.firstName} '),
              Text('Last: ${user?.lastName} '),
              Text('Email: ${user?.email}'),
              Text('Profile image: ${user?.profileImageUrl}'),
            ],
          ),
        ],
      ),
    );
  }
}

class LinkedInAuthCodeExamplePage extends StatefulWidget {
  const LinkedInAuthCodeExamplePage({super.key});

  @override
  State createState() => _LinkedInAuthCodeExamplePageState();
}

class _LinkedInAuthCodeExamplePageState extends State<LinkedInAuthCodeExamplePage> {
  AuthCodeObject? authorizationCode;
  bool logoutUser = false;

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: <Widget>[
        LinkedInButtonStandardWidget(
          onTap: () {
            Navigator.push(
              context,
              MaterialPageRoute<void>(
                builder: (BuildContext context) => LinkedInAuthCodeWidget(
                  destroySession: logoutUser,
                  redirectUrl: redirectUrl,
                  clientId: clientId,
                  onError: (AuthorizationFailedAction e) {
                    print('Error: ${e.toString()}');
                    print('Error: ${e.stackTrace.toString()}');
                  },
                  onGetAuthCode: (AuthorizationSucceededAction response) {
                    print('Auth code ${response.codeResponse.code}');
                    print('State: ${response.codeResponse.state}');

                    authorizationCode = AuthCodeObject(
                      code: response.codeResponse.code,
                      state: response.codeResponse.state,
                    );
                    setState(() {});

                    Navigator.pop(context);
                  },
                ),
                fullscreenDialog: true,
              ),
            );
          },
        ),
        LinkedInButtonStandardWidget(
          onTap: () {
            setState(() {
              authorizationCode = null;
              logoutUser = true;
            });
          },
          buttonText: 'Logout user',
        ),
        Container(
          margin: const EdgeInsets.symmetric(horizontal: 16),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('Auth code: ${authorizationCode?.code} '),
              Text('State: ${authorizationCode?.state} '),
            ],
          ),
        ),
      ],
    );
  }
}

class AuthCodeObject {
  AuthCodeObject({required this.code, required this.state});

  final String? code;
  final String? state;
}

class UserObject {
  UserObject({
    required this.firstName,
    required this.lastName,
    required this.email,
    required this.profileImageUrl,
  });

  final String? firstName;
  final String? lastName;
  final String? email;
  final String? profileImageUrl;
}

关键点说明

  1. 配置LinkedIn应用:你需要在LinkedIn开发者平台创建一个应用,并获取clientIdclientSecretredirectUrl
  2. LinkedInUserWidget:用于获取用户的完整信息,包括姓名、电子邮件和头像等。
  3. LinkedInAuthCodeWidget:用于仅获取授权码,适用于只需要授权而不直接获取用户信息的场景。
  4. 登出用户:通过设置destroySessiontrue来清除会话并登出用户。

希望这个示例能帮助你更好地理解和使用 linkedin_login 插件。如果你有任何问题或需要进一步的帮助,请随时提问!


更多关于Flutter LinkedIn登录插件linkedin_login的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter LinkedIn登录插件linkedin_login的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter应用中使用linkedin_login插件来实现LinkedIn登录的示例代码。

首先,你需要在pubspec.yaml文件中添加linkedin_login依赖:

dependencies:
  flutter:
    sdk: flutter
  linkedin_login: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来,你需要配置LinkedIn开发者平台,获取你的客户端ID和客户端密钥,并设置重定向URI。确保在LinkedIn开发者平台上设置的包名与你的Flutter应用的包名一致。

在你的Flutter项目中,你可以按照以下步骤实现LinkedIn登录:

  1. 配置LinkedIn SDK

    在你的android/app/src/main/AndroidManifest.xml文件中添加LinkedIn SDK所需的权限和配置:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.yourapp">
    
        <!-- LinkedIn SDK permissions -->
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    
        <application
            ...>
            <!-- LinkedIn SDK configuration -->
            <meta-data
                android:name="com.linkedin.sdk.android.APP_ID"
                android:value="your_linkedin_app_id"/> <!-- 替换为你的LinkedIn应用ID -->
        </application>
    </manifest>
    
  2. 实现LinkedIn登录逻辑

    在你的Flutter代码中,你可以这样实现LinkedIn登录:

    import 'package:flutter/material.dart';
    import 'package:linkedin_login/linkedin_login.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: LinkedInLoginPage(),
        );
      }
    }
    
    class LinkedInLoginPage extends StatefulWidget {
      @override
      _LinkedInLoginPageState createState() => _LinkedInLoginPageState();
    }
    
    class _LinkedInLoginPageState extends State<LinkedInLoginPage> {
      final LinkedInLogin _linkedInLogin = LinkedInLogin(
        clientId: 'your_linkedin_client_id', // 替换为你的LinkedIn客户端ID
        clientSecret: 'your_linkedin_client_secret', // 替换为你的LinkedIn客户端密钥
        redirectUri: 'linkedin://success', // LinkedIn重定向URI,需要在LinkedIn开发者平台上配置
        state: 'DCFSDF4545ASDFSF', // 一个唯一的状态字符串,用于防止CSRF攻击
      );
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('LinkedIn Login Example'),
          ),
          body: Center(
            child: ElevatedButton(
              onPressed: () async {
                try {
                  final LinkedInUser user = await _linkedInLogin.login();
                  print('LinkedIn User: ${user.toJson()}');
                } catch (e) {
                  print('Error during LinkedIn login: $e');
                }
              },
              child: Text('Login with LinkedIn'),
            ),
          ),
        );
      }
    }
    
    // LinkedInUser 类定义(假设LinkedInLogin插件返回的数据结构)
    class LinkedInUser {
      String id;
      String firstName;
      String lastName;
      String profilePictureUrl;
    
      LinkedInUser({
        required this.id,
        required this.firstName,
        required this.lastName,
        required this.profilePictureUrl,
      });
    
      Map<String, dynamic> toJson() {
        return {
          'id': id,
          'firstName': firstName,
          'lastName': lastName,
          'profilePictureUrl': profilePictureUrl,
        };
      }
    }
    

请注意,LinkedInUser类是基于假设的数据结构定义的,实际使用时你可能需要根据linkedin_login插件返回的实际数据结构进行调整。

另外,由于LinkedIn API和SDK的更新,上述代码可能需要根据最新的linkedin_login插件文档和LinkedIn开发者平台的指南进行调整。确保查阅最新的文档和指南以获取最准确的信息。

回到顶部