Skip to content

Commit b493831

Browse files
authored
增加对 ServerSide 登录模式的支持 (#102)
* feat: login with serverside * test: login with serverside * feat: login with serverside(iOS)
1 parent 9631cc1 commit b493831

File tree

6 files changed

+63
-0
lines changed

6 files changed

+63
-0
lines changed

android/src/main/java/io/github/v7lin/tencent_kit/TencentKitPlugin.java

+10
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
160160
result.success(tencent != null && isAppInstalled(applicationContext, "com.tencent.tim"));
161161
} else if ("login".equals(call.method)) {
162162
login(call, result);
163+
} else if ("loginServerSide".equals(call.method)) {
164+
loginServerSide(call, result);
163165
} else if ("logout".equals(call.method)) {
164166
logout(call, result);
165167
} else if ("shareMood".equals(call.method)) {
@@ -185,6 +187,14 @@ private void login(@NonNull MethodCall call, @NonNull Result result) {
185187
result.success(null);
186188
}
187189

190+
private void loginServerSide(@NonNull MethodCall call, @NonNull Result result) {
191+
final String scope = call.argument("scope");
192+
if (tencent != null) {
193+
tencent.loginServerSide(activityPluginBinding.getActivity(), scope, loginListener);
194+
}
195+
result.success(null);
196+
}
197+
188198
private IUiListener loginListener = new IUiListener() {
189199
@Override
190200
public void onComplete(Object o) {

example/lib/main.dart

+8
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,14 @@ class _HomeState extends State<Home> {
107107
);
108108
},
109109
),
110+
ListTile(
111+
title: Text('登录(Server-Side)'),
112+
onTap: () {
113+
TencentKitPlatform.instance.loginServerSide(
114+
scope: <String>[TencentScope.kGetUserInfo],
115+
);
116+
},
117+
),
110118
ListTile(
111119
title: Text('获取用户信息'),
112120
onTap: () async {

ios/Classes/TencentKitPlugin.m

+18
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ - (void)handleMethodCall:(FlutterMethodCall *)call
6767
result([NSNumber numberWithBool:[TencentOAuth iphoneTIMInstalled]]);
6868
} else if ([@"login" isEqualToString:call.method]) {
6969
[self login:call result:result];
70+
} else if ([@"loginServerSide" isEqualToString:call.method]) {
71+
[self loginServerSide:call result:result];
7072
} else if ([@"logout" isEqualToString:call.method]) {
7173
[self logout:call result:result];
7274
} else if ([@"shareMood" isEqualToString:call.method]) {
@@ -88,6 +90,17 @@ - (void)login:(FlutterMethodCall *)call result:(FlutterResult)result {
8890
if (_oauth != nil) {
8991
NSString *scope = call.arguments[@"scope"];
9092
NSArray *permissions = [scope componentsSeparatedByString:@","];
93+
_oauth.authMode = kAuthModeClientSideToken;
94+
[_oauth authorize:permissions];
95+
}
96+
result(nil);
97+
}
98+
99+
- (void)loginServerSide:(FlutterMethodCall *)call result:(FlutterResult)result {
100+
if (_oauth != nil) {
101+
NSString *scope = call.arguments[@"scope"];
102+
NSArray *permissions = [scope componentsSeparatedByString:@","];
103+
_oauth.authMode = kAuthModeServerSideCode;
91104
[_oauth authorize:permissions];
92105
}
93106
result(nil);
@@ -278,6 +291,11 @@ - (void)tencentDidLogin {
278291
if (_oauth.accessToken != nil && _oauth.accessToken.length > 0) {
279292
NSString *openId = _oauth.openId;
280293
NSString *accessToken = _oauth.accessToken;
294+
if (_oauth.authMode == kAuthModeServerSideCode) {
295+
// 将 code 的值赋给 accessToken, 避免字段功能混淆
296+
// 同时官方文档也有说明通过此接口获取的 code 实际上就是 accessToken
297+
accessToken = [_oauth getServerSideCode];
298+
}
281299
long long expiresIn =
282300
ceil(_oauth.expirationDate.timeIntervalSinceNow); // 向上取整
283301
long long createAt = [[NSDate date] timeIntervalSince1970] * 1000.0;

lib/src/tencent_kit_method_channel.dart

+12
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,18 @@ class MethodChannelTencentKit extends TencentKitPlatform {
8383
);
8484
}
8585

86+
@override
87+
Future<void> loginServerSide({
88+
required List<String> scope,
89+
}) {
90+
return methodChannel.invokeMethod<void>(
91+
'loginServerSide',
92+
<String, dynamic>{
93+
'scope': scope.join(','),
94+
},
95+
);
96+
}
97+
8698
@override
8799
Future<void> logout() {
88100
return methodChannel.invokeMethod<void>('logout');

lib/src/tencent_kit_platform_interface.dart

+8
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ abstract class TencentKitPlatform extends PlatformInterface {
6565
'login({required scope}) has not been implemented.');
6666
}
6767

68+
/// 登录(Server-Side)
69+
Future<void> loginServerSide({
70+
required List<String> scope,
71+
}) {
72+
throw UnimplementedError(
73+
'loginServerSide({required scope}) has not been implemented.');
74+
}
75+
6876
/// 登出
6977
Future<void> logout() {
7078
throw UnimplementedError('logout() has not been implemented.');

test/tencent_kit_test.dart

+7
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ class MockTencentKitPlatform
4646
throw UnimplementedError();
4747
}
4848

49+
@override
50+
Future<void> loginServerSide({
51+
required List<String> scope,
52+
}) {
53+
throw UnimplementedError();
54+
}
55+
4956
@override
5057
Future<void> logout() {
5158
throw UnimplementedError();

0 commit comments

Comments
 (0)