我在我的应用程序上使用了 Google Sign-in:相关代码大致如下:
var acc = await signInService.signIn();
var auth = await acc.authentication;
var token = auth.idToken;
Run Code Online (Sandbox Code Playgroud)
这给了我一个很好的长令牌,然后我使用 HTTP POST 将其传递给我的后端(这工作正常),然后尝试验证。我在我的颤振树和后端服务器(nodejs/restify)上有相同的 google-services.json 文件。后端代码大致如下:
let creds = require('./google-services.json');
let auth = require('google-auth-library').OAuth2Client;
let client = new auth(creds.client[0].oauth_client[0].client_id);
. . .
let ticket = await client.verifyIdToken({
idToken: token,
audience: creds.client[0].oauth_client[0].client_id
});
let payload = ticket.getPayload();
Run Code Online (Sandbox Code Playgroud)
这始终会返回我的错误“错误的收件人,有效负载受众!= requiredAudience”。
我也尝试过单独注册 GCP 控制台并使用这些键/client_id,但结果相同。我在哪里可以找到可以正确验证此令牌的有效 client_id?
我已经阅读了这里的所有内容以及在网上可以找到的有关执行此操作的所有信息,但这些信息已过时,自相矛盾或不适用。我在C语言中有一个非常简单的库,可以将其编译为Linux中的共享库,并且一切运行都很好。我想将此移植到Windows DLL。自1990年代以来,我还没有对Windows进行过编程,但是我对它的复杂性并不是一无所知(事实上,它们是我使用Linux的原因:-)。
生成库的MinGW编译器行如下(由cmake生成):
gcc.exe -Wl,--export-all -Wl,--enable-auto-import -shared -o libonejoker.dll -Wl,--out-implib,libonejoker.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -Wl,--whole-archive CMakeFiles/onejoker.dir/objects.a -Wl,--no-whole-archive -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
Run Code Online (Sandbox Code Playgroud)
不知道为什么或是否需要所有这些库,因为我根本没有在库中进行任何OS调用,但是cmake将它们放在了那里。这将创建dll和.dll.a。我告诉cmake添加-Wl,-export-all,尽管这应该是默认设置。尝试将我的简单测试程序与新创建的dll链接起来可以做到这一点:
gcc.exe -g @CMakeFiles/test004.dir/includes_C.rsp -o CMakeFiles/test004.dir/test004.c.obj -c /c/Users/Lee/Projects/OneJoker/src/tests/test004.c
gcc.exe -g -Wl,--whole-archive CMakeFiles/test004.dir/objects.a -Wl,--no-whole-archive -o test004.exe -Wl,--out-implib,libtest004.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -L/C/Users/Lee/Projects/OneJoker/build/src/lib ../lib/libonejoker.dll.a -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
Run Code Online (Sandbox Code Playgroud)
如果程序“ test004”没有从DLL调用任何功能,则可以正常工作。一旦取消注释任何从库中调用任何函数的行,它就会静默失败,甚至不会进入main()。gdb没有给出堆栈跟踪,但是说:
During startup program exited with code 0xc0000135.
Run Code Online (Sandbox Code Playgroud)
谷歌搜索并没有发现任何有用的信息。请注意:
任何指向正确方向的指针都将有所帮助,包括仅将我指向并非过时且不适用于C ++的文档。
我已经阅读了这里的每个答案,维基百科和WikiHow,印度人的讲座和其他来源,我很确定我理解他们所说的并且已经以这种方式实现了.但是我对所有这些解释都明显错误的说法感到困惑.
他们都说要用最少的行数来覆盖矩阵中的零,如果它等于N(即每行和每列都有一个零),那么就有一个零解,我们就完成了.但后来我发现了这个:
a b c d e
A 0 7 0 0 0
B 0 8 0 0 6
C 5 0 7 3 4
D 5 0 5 9 3
E 0 4 0 0 9
Run Code Online (Sandbox Code Playgroud)
每行和每列都有一个零,并且没有办法覆盖少于五行的零,但显然没有零解决方案.行C在列b中只有零,但对于行D没有留下零.
我在这里误解了什么吗?我是否需要更好的测试,以确定是否可以进行零分配?所有这些来源都遗漏了必要的东西吗?