Expo Android stand alone Google sign in error - reactjs

When I try to sign in with google inside an android stand alone app, it gives the following error:
{"framesToPop":1,"code":"GOOGLE_ERROR"}
This is the app.json(changed the last four digits of hash and apikey, just for stack-overflow )
{
"expo": {
"name": "flux-scrollable",
"description": "An empty new project",
"slug": "flux-scrollable",
"privacy": "public",
"sdkVersion": "19.0.0",
"android": {
"package": "com.anonsment.chat",
"config": {
"googleSignIn": {
"apiKey": "AIzaSyD5d-Y6MKS3wmxUOHvBTGhIMPOmZC9mvdc",
"certificateHash": "F6B135645BC1D38C2FF5CE2C7BC3E7C573CCA943"
}
}
},
"version": "1.0.0",
"orientation": "portrait",
"primaryColor": "#cccccc",
"icon": "./assets/icons/app-icon.png",
"loading": {
"icon": "./assets/icons/loading-icon.png",
"hideExponentText": false
},
"packagerOpts": {
"assetExts": [
"ttf",
"mp4"
]
},
"ios": {
"supportsTablet": true
}
}
}
Code for login
const { type, user } = await Google.logInAsync({
androidStandaloneAppClientId:'173851312683-pittv77ag7tn3tpq26bvu6d5nirbs5dr.apps.googleusercontent.com',
iosStandaloneAppClientId: '<IOS_CLIENT_ID>',
androidClientId: '603386649315-9rbv8vmv2vvftetfbvlrbufcps1fajqf.apps.googleusercontent.com',
iosClientId: '603386649315-vp4revvrcgrcjme51ebuhbkbspl048l9.apps.googleusercontent.com',
scopes: ['profile', 'email']
});

Maybe you need to add behavior: 'web' in your code
const { type, user } = await Google.logInAsync({
androidStandaloneAppClientId:'173851312683-pittv77ag7tn3tpq26bvu6d5nirbs5dr.apps.googleusercontent.com',
iosStandaloneAppClientId: '<IOS_CLIENT_ID>',
androidClientId: '603386649315-9rbv8vmv2vvftetfbvlrbufcps1fajqf.apps.googleusercontent.com',
iosClientId: '603386649315-vp4revvrcgrcjme51ebuhbkbspl048l9.apps.googleusercontent.com',
behavior: 'web',
scopes: ['profile', 'email'] });

Related

[ServiceEndpoint]: ServiceEndpoint grpcs://localhost:7050 reset connection failed :: TypeError:Channel credentials must be a ChannelCredentials object

I set up a Hyperledger Fabric 2.2 network successfully but unable to query/invoke assets through nodeJs SDK. The node version I am using is 16. I think the issue is with grpc most probably. I was able to create assets when I was using node version 12 but not with version 16
Error snippet
Loaded the network configuration located at /home/harsh/Videos/standardc-backend-master-v3-dlt/fabric-network-setup/fabric-swarm/common-connection-profile.json
Connect to Fabric gateway.
2023-02-13T15:28:45.076Z - info: [NetworkConfig]: buildOrderer - Unable to connect to the committer ord1_standardc_io due to TypeError: Channel credentials must be a ChannelCredentials object
at new ChannelImplementation (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-common/node_modules/#grpc/grpc-js/build/src/channel.js:102:19)
at new Client (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-common/node_modules/#grpc/grpc-js/build/src/client.js:65:36)
at new ServiceClientImpl (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-common/node_modules/#grpc/grpc-js/build/src/make-client.js:58:5)
at Committer.connect (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-network/node_modules/fabric-common/lib/ServiceEndpoint.js:120:18)
at buildOrderer (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-network/lib/impl/ccp/networkconfig.js:103:23)
at async Object.loadFromConfig (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-network/lib/impl/ccp/networkconfig.js:50:13)
at async Gateway.connect (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-network/lib/gateway.js:299:13)
at async evaluate (/home/harsh/Videos/standardc-backend-master-v3-dlt/modules/dlt/commonHyperledgerHelpers/query.js:50:5)
at async queryAssetById (/home/harsh/Videos/standardc-backend-master-v3-dlt/modules/dlt/asset/asset.js:149:20)
2023-02-13T15:28:45.080Z - info: [NetworkConfig]: buildOrderer - Unable to connect to the committer ord2_standardc_io due to TypeError: Channel credentials must be a ChannelCredentials object
at new ChannelImplementation (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-common/node_modules/#grpc/grpc-js/build/src/channel.js:102:19)
at new Client (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-common/node_modules/#grpc/grpc-js/build/src/client.js:65:36)
at new ServiceClientImpl (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-common/node_modules/#grpc/grpc-js/build/src/make-client.js:58:5)
at Committer.connect (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-network/node_modules/fabric-common/lib/ServiceEndpoint.js:120:18)
at buildOrderer (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-network/lib/impl/ccp/networkconfig.js:103:23)
at async Object.loadFromConfig (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-network/lib/impl/ccp/networkconfig.js:50:13)
at async Gateway.connect (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-network/lib/gateway.js:299:13)
at async evaluate (/home/harsh/Videos/standardc-backend-master-v3-dlt/modules/dlt/commonHyperledgerHelpers/query.js:50:5)
at async queryAssetById (/home/harsh/Videos/standardc-backend-master-v3-dlt/modules/dlt/asset/asset.js:149:20)
2023-02-13T15:28:45.083Z - info: [NetworkConfig]: buildOrderer - Unable to connect to the committer ord3_standardc_io due to TypeError: Channel credentials must be a ChannelCredentials object
at new ChannelImplementation (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-common/node_modules/#grpc/grpc-js/build/src/channel.js:102:19)
at new Client (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-common/node_modules/#grpc/grpc-js/build/src/client.js:65:36)
at new ServiceClientImpl (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-common/node_modules/#grpc/grpc-js/build/src/make-client.js:58:5)
at Committer.connect (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-network/node_modules/fabric-common/lib/ServiceEndpoint.js:120:18)
at buildOrderer (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-network/lib/impl/ccp/networkconfig.js:103:23)
at async Object.loadFromConfig (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-network/lib/impl/ccp/networkconfig.js:50:13)
at async Gateway.connect (/home/harsh/Videos/standardc-backend-master-v3-dlt/node_modules/fabric-network/lib/gateway.js:299:13)
at async evaluate (/home/harsh/Videos/standardc-backend-master-v3-dlt/modules/dlt/commonHyperledgerHelpers/query.js:50:5)
at async queryAssetById (/home/harsh/Videos/standardc-backend-master-v3-dlt/modules/dlt/asset/asset.js:149:20)
Use network channel: standardcdltchannel.
2023-02-13T15:28:45.161Z - error: [ServiceEndpoint]: ServiceEndpoint grpcs://localhost:7050 reset connection failed :: TypeError: Channel credentials must be a ChannelCredentials object
2023-02-13T15:28:45.163Z - error: [ServiceEndpoint]: ServiceEndpoint grpcs://localhost:7050 reset connection failed :: TypeError: Channel credentials must be a ChannelCredentials object
2023-02-13T15:28:45.165Z - error: [ServiceEndpoint]: ServiceEndpoint grpcs://localhost:7050 reset connection failed :: TypeError: Channel credentials must be a ChannelCredentials object
Common-connection-profile
{
"name": "abcd",
"version": "1.0.0",
"channels": {
"standardcdltchannel": {
"orderers": [
"ord1_standardc_io",
"ord2_standardc_io",
"ord3_standardc_io"
],
"peers": [
"a1_admin_standardc_io",
"a2_admin_standardc_io",
"a1_fin_standardc_io",
"a2_fin_standardc_io",
"a1_user_standardc_io",
"a2_user_standardc_io"
]
}
},
"orderers": {
"ord1_standardc_io": {
"url": "grpcs://localhost:7050",
"grpcOptions": {
"ssl-target-name-override": "ord1_standardc_io"
},
"tlsCACerts": {
"path": "fabric-network-setup/fabric-swarm/crypto-config/ordererOrganizations/standardc_io/orderers/ord1_standardc_io/tls/ca.crt"
}
},
"ord2_standardc_io": {
"url": "grpcs://localhost:8050",
"grpcOptions": {
"ssl-target-name-override": "ord2_standardc_io"
},
"tlsCACerts": {
"path": "fabric-network-setup/fabric-swarm/crypto-config/ordererOrganizations/standardc_io/orderers/ord2_standardc_io/tls/ca.crt"
}
},
"ord3_standardc_io": {
"url": "grpcs://localhost:9050",
"grpcOptions": {
"ssl-target-name-override": "ord3_standardc_io"
},
"tlsCACerts": {
"path": "fabric-network-setup/fabric-swarm/crypto-config/ordererOrganizations/standardc_io/orderers/ord3_standardc_io/tls/ca.crt"
}
}
},
"organizations": {
"StandardCAdmin": {
"mspid": "StandardCAdminMSP",
"peers": [
"a1_admin_standardc_io",
"a2_admin_standardc_io"
],
"certificateAuthorities": [
"ca_StandardCAdmin"
]
},
"StandardCFin": {
"mspid": "StandardCFinMSP",
"peers": [
"a1_fin_standardc_io",
"a2_fin_standardc_io"
],
"certificateAuthorities": [
"ca_StandardCFin"
]
},
"StandardCUser": {
"mspid": "StandardCUserMSP",
"peers": [
"a1_user_standardc_io",
"a2_user_standardc_io"
],
"certificateAuthorities": [
"ca_StandardCUser"
]
}
},
"peers": {
"a1_admin_standardc_io": {
"url": "grpcs://localhost:7051",
"grpcOptions": {
"ssl-target-name-override": "a1_admin_standardc_io",
"hostnameOverride": "a1_admin_standardc_io"
},
"tlsCACerts": {
"pem": "-----BEGIN CERTIFICATE-----\nMIICXzCCAgagAwIBAgIRAPGMIxMpZ7KcQuC1J115hKcwCgYIKoZIzj0EAwIwejEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGzAZBgNVBAoMEmFkbWluX3N0YW5kYXJkY19pbzEhMB8GA1UEAwwY\ndGxzY2EuYWRtaW5fc3RhbmRhcmRjX2lvMB4XDTIzMDIxMzEwNDEwMFoXDTMzMDIx\nMDEwNDEwMFowejELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAU\nBgNVBAcTDVNhbiBGcmFuY2lzY28xGzAZBgNVBAoMEmFkbWluX3N0YW5kYXJkY19p\nbzEhMB8GA1UEAwwYdGxzY2EuYWRtaW5fc3RhbmRhcmRjX2lvMFkwEwYHKoZIzj0C\nAQYIKoZIzj0DAQcDQgAEP7hrn3FOgSIoV2OFpF5N448bXLg8NdwWSXJ76xra1Dsj\nJfS6+A6OKp+4X0VZ7vfUqvVNSj0vU611osqopRYWt6NtMGswDgYDVR0PAQH/BAQD\nAgGmMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTAD\nAQH/MCkGA1UdDgQiBCCxhxWEEntqKYczzMh3sncOGFwiP9XB8U/hmUTRFnboWzAK\nBggqhkjOPQQDAgNHADBEAiAf3ZbcFLushIlfZ4dD67SVUMay6EdUE7mPvsUXXLqF\nQwIgeRFexyjDtl3bAnCrf/KNe9uPq/epZWXMvS+JnGgBO8s=\n-----END CERTIFICATE-----\n"
}
},
"a2_admin_standardc_io": {
"url": "grpcs://localhost:10105",
"grpcOptions": {
"ssl-target-name-override": "a2_admin_standardc_io",
"hostnameOverride": "a2_admin_standardc_io"
},
"tlsCACerts": {
"pem": "-----BEGIN CERTIFICATE-----\nMIICXzCCAgagAwIBAgIRAPGMIxMpZ7KcQuC1J115hKcwCgYIKoZIzj0EAwIwejEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGzAZBgNVBAoMEmFkbWluX3N0YW5kYXJkY19pbzEhMB8GA1UEAwwY\ndGxzY2EuYWRtaW5fc3RhbmRhcmRjX2lvMB4XDTIzMDIxMzEwNDEwMFoXDTMzMDIx\nMDEwNDEwMFowejELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAU\nBgNVBAcTDVNhbiBGcmFuY2lzY28xGzAZBgNVBAoMEmFkbWluX3N0YW5kYXJkY19p\nbzEhMB8GA1UEAwwYdGxzY2EuYWRtaW5fc3RhbmRhcmRjX2lvMFkwEwYHKoZIzj0C\nAQYIKoZIzj0DAQcDQgAEP7hrn3FOgSIoV2OFpF5N448bXLg8NdwWSXJ76xra1Dsj\nJfS6+A6OKp+4X0VZ7vfUqvVNSj0vU611osqopRYWt6NtMGswDgYDVR0PAQH/BAQD\nAgGmMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTAD\nAQH/MCkGA1UdDgQiBCCxhxWEEntqKYczzMh3sncOGFwiP9XB8U/hmUTRFnboWzAK\nBggqhkjOPQQDAgNHADBEAiAf3ZbcFLushIlfZ4dD67SVUMay6EdUE7mPvsUXXLqF\nQwIgeRFexyjDtl3bAnCrf/KNe9uPq/epZWXMvS+JnGgBO8s=\n-----END CERTIFICATE-----\n"
}
},
"a1_fin_standardc_io": {
"url": "grpcs://localhost:8051",
"grpcOptions": {
"ssl-target-name-override": "a1_fin_standardc_io",
"hostnameOverride": "a1_fin_standardc_io"
},
"tlsCACerts": {
"pem": "-----BEGIN CERTIFICATE-----\nMIICWDCCAf6gAwIBAgIRAPLNPsjll3MJ1JtK4H2n7SIwCgYIKoZIzj0EAwIwdjEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGTAXBgNVBAoMEGZpbl9zdGFuZGFyZGNfaW8xHzAdBgNVBAMMFnRs\nc2NhLmZpbl9zdGFuZGFyZGNfaW8wHhcNMjMwMjEzMTA0MTAwWhcNMzMwMjEwMTA0\nMTAwWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE\nBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UECgwQZmluX3N0YW5kYXJkY19pbzEfMB0G\nA1UEAwwWdGxzY2EuZmluX3N0YW5kYXJkY19pbzBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABDpbUyoFRVo7xoIuTCwmCosJujfQbMDNuO9d9ZrouyR6Z+hHsHygBnSU\nL5TjSQ5rBHicwVWDhpD+p3UTiqNH1cyjbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNV\nHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNV\nHQ4EIgQgBW/ha6XUwwxfLHUbngYe1fFSi7wE2YHvVnLrCmjaIQQwCgYIKoZIzj0E\nAwIDSAAwRQIhAPhfFS5BwyQ9kGj7+YR8U+yXyNK42J89Ym77oTtTjKlmAiB5Q3yk\nagyJDOrYyxmAXu+7YgrYUD0Hu6BOVWk6ply7Pg==\n-----END CERTIFICATE-----\n"
}
},
"a2_fin_standardc_io": {
"url": "grpcs://localhost:10205",
"grpcOptions": {
"ssl-target-name-override": "a2_fin_standardc_io",
"hostnameOverride": "a2_fin_standardc_io"
},
"tlsCACerts": {
"pem": "-----BEGIN CERTIFICATE-----\nMIICWDCCAf6gAwIBAgIRAPLNPsjll3MJ1JtK4H2n7SIwCgYIKoZIzj0EAwIwdjEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGTAXBgNVBAoMEGZpbl9zdGFuZGFyZGNfaW8xHzAdBgNVBAMMFnRs\nc2NhLmZpbl9zdGFuZGFyZGNfaW8wHhcNMjMwMjEzMTA0MTAwWhcNMzMwMjEwMTA0\nMTAwWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE\nBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UECgwQZmluX3N0YW5kYXJkY19pbzEfMB0G\nA1UEAwwWdGxzY2EuZmluX3N0YW5kYXJkY19pbzBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABDpbUyoFRVo7xoIuTCwmCosJujfQbMDNuO9d9ZrouyR6Z+hHsHygBnSU\nL5TjSQ5rBHicwVWDhpD+p3UTiqNH1cyjbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNV\nHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNV\nHQ4EIgQgBW/ha6XUwwxfLHUbngYe1fFSi7wE2YHvVnLrCmjaIQQwCgYIKoZIzj0E\nAwIDSAAwRQIhAPhfFS5BwyQ9kGj7+YR8U+yXyNK42J89Ym77oTtTjKlmAiB5Q3yk\nagyJDOrYyxmAXu+7YgrYUD0Hu6BOVWk6ply7Pg==\n-----END CERTIFICATE-----\n"
}
},
"a1_user_standardc_io": {
"url": "grpcs://localhost:9051",
"grpcOptions": {
"ssl-target-name-override": "a1_user_standardc_io",
"hostnameOverride": "a1_user_standardc_io"
},
"tlsCACerts": {
"pem": "-----BEGIN CERTIFICATE-----\nMIICWzCCAgGgAwIBAgIQfzttriKt8PjPCq6ahVRsgTAKBggqhkjOPQQDAjB4MQsw\nCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy\nYW5jaXNjbzEaMBgGA1UECgwRdXNlcl9zdGFuZGFyZGNfaW8xIDAeBgNVBAMMF3Rs\nc2NhLnVzZXJfc3RhbmRhcmRjX2lvMB4XDTIzMDIxMzEwNDEwMFoXDTMzMDIxMDEw\nNDEwMFoweDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNV\nBAcTDVNhbiBGcmFuY2lzY28xGjAYBgNVBAoMEXVzZXJfc3RhbmRhcmRjX2lvMSAw\nHgYDVQQDDBd0bHNjYS51c2VyX3N0YW5kYXJkY19pbzBZMBMGByqGSM49AgEGCCqG\nSM49AwEHA0IABEEH6Km7J/yMIPVmV5xHGO4z/70817YsUB3vhEcPzW24Utb9Fa4z\nV5PFL1F3THPCC03/j6FKkH2Sb8U5kR6H4A2jbTBrMA4GA1UdDwEB/wQEAwIBpjAd\nBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zAp\nBgNVHQ4EIgQgeiTgppGQVAIkzh/rUj/mkAvrzo02U42GQ+yqISd+0akwCgYIKoZI\nzj0EAwIDSAAwRQIhAK2Jif9AmcyXMjw0QtNsqvynrdHEhsrkRH3faCfxa0ECAiBS\njXiY+4T66F//0F4xk1FUhJaeZQCm5hCYt/h1AlNi6g==\n-----END CERTIFICATE-----\n"
}
},
"a2_user_standardc_io": {
"url": "grpcs://localhost:10305",
"grpcOptions": {
"ssl-target-name-override": "a2_user_standardc_io",
"hostnameOverride": "a2_user_standardc_io"
},
"tlsCACerts": {
"pem": "-----BEGIN CERTIFICATE-----\nMIICWzCCAgGgAwIBAgIQfzttriKt8PjPCq6ahVRsgTAKBggqhkjOPQQDAjB4MQsw\nCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy\nYW5jaXNjbzEaMBgGA1UECgwRdXNlcl9zdGFuZGFyZGNfaW8xIDAeBgNVBAMMF3Rs\nc2NhLnVzZXJfc3RhbmRhcmRjX2lvMB4XDTIzMDIxMzEwNDEwMFoXDTMzMDIxMDEw\nNDEwMFoweDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNV\nBAcTDVNhbiBGcmFuY2lzY28xGjAYBgNVBAoMEXVzZXJfc3RhbmRhcmRjX2lvMSAw\nHgYDVQQDDBd0bHNjYS51c2VyX3N0YW5kYXJkY19pbzBZMBMGByqGSM49AgEGCCqG\nSM49AwEHA0IABEEH6Km7J/yMIPVmV5xHGO4z/70817YsUB3vhEcPzW24Utb9Fa4z\nV5PFL1F3THPCC03/j6FKkH2Sb8U5kR6H4A2jbTBrMA4GA1UdDwEB/wQEAwIBpjAd\nBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zAp\nBgNVHQ4EIgQgeiTgppGQVAIkzh/rUj/mkAvrzo02U42GQ+yqISd+0akwCgYIKoZI\nzj0EAwIDSAAwRQIhAK2Jif9AmcyXMjw0QtNsqvynrdHEhsrkRH3faCfxa0ECAiBS\njXiY+4T66F//0F4xk1FUhJaeZQCm5hCYt/h1AlNi6g==\n-----END CERTIFICATE-----\n"
}
}
},
"certificateAuthorities": {
"ca_StandardCAdmin": {
"url": "https://localhost:7054",
"caName": "ca_StandardCAdmin",
"tlsCACerts": {
"pem": "-----BEGIN CERTIFICATE-----\nMIICWTCCAf+gAwIBAgIQGqmY2TnbrYHpfSLWJG9slzAKBggqhkjOPQQDAjB3MQsw\nCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy\nYW5jaXNjbzEbMBkGA1UECgwSYWRtaW5fc3RhbmRhcmRjX2lvMR4wHAYDVQQDDBVj\nYS5hZG1pbl9zdGFuZGFyZGNfaW8wHhcNMjMwMjEzMTA0MTAwWhcNMzMwMjEwMTA0\nMTAwWjB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE\nBxMNU2FuIEZyYW5jaXNjbzEbMBkGA1UECgwSYWRtaW5fc3RhbmRhcmRjX2lvMR4w\nHAYDVQQDDBVjYS5hZG1pbl9zdGFuZGFyZGNfaW8wWTATBgcqhkjOPQIBBggqhkjO\nPQMBBwNCAAQjAX9P5VDzrYNCyAX3VVyx+b2Zj6ksqr0kjwrK7p7tw44Re9gDnrZx\ns1T4TQtays+3vdJVrcR60XfljJah5KHLo20wazAOBgNVHQ8BAf8EBAMCAaYwHQYD\nVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYD\nVR0OBCIEINP68n78uQQUXLyEj8Z3t7i+P6DAhLTrqxZg4Z6STy/HMAoGCCqGSM49\nBAMCA0gAMEUCIQCwErwt0jkJCvEXMNKK4wfHdr7bc+VJBwTx/+55wPDq7gIgS++Q\nHoo9XcFa0tTxaHIXlw/RSUHyhjtlQcbmQkGYTxc=\n-----END CERTIFICATE-----\n"
},
"httpOptions": {
"verify": false
}
},
"ca_StandardCFin": {
"url": "https://localhost:8054",
"caName": "ca_StandardCFin",
"tlsCACerts": {
"pem": "-----BEGIN CERTIFICATE-----\nMIICUTCCAfegAwIBAgIQF73X1H/A97e8dD9ONdx+uzAKBggqhkjOPQQDAjBzMQsw\nCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy\nYW5jaXNjbzEZMBcGA1UECgwQZmluX3N0YW5kYXJkY19pbzEcMBoGA1UEAwwTY2Eu\nZmluX3N0YW5kYXJkY19pbzAeFw0yMzAyMTMxMDQxMDBaFw0zMzAyMTAxMDQxMDBa\nMHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T\nYW4gRnJhbmNpc2NvMRkwFwYDVQQKDBBmaW5fc3RhbmRhcmRjX2lvMRwwGgYDVQQD\nDBNjYS5maW5fc3RhbmRhcmRjX2lvMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n7okOZKS2UcKbXyPTcuUKm4IwyixTop0acLApHul7jdHlCagaHHp8ZRDkujrSMwFW\nSE2XyAliby+qKBZzTo4Tp6NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG\nCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCDQ\nLKzwFEERdwOuOiXqe6NWzDHsX7n0uhQYhMS/SvWToTAKBggqhkjOPQQDAgNIADBF\nAiEA6bFSIeCZlSnIQJ8SEhMgaLyk0QQmxeE9KzbeJEAyhAUCIBNaZUC0YGXB2mm4\nYHbxf0BYRgLI+/tNMD20NwqVr6MQ\n-----END CERTIFICATE-----\n"
},
"httpOptions": {
"verify": false
}
},
"ca_StandardCUser": {
"url": "https://localhost:9054",
"caName": "ca_StandardCUser",
"tlsCACerts": {
"pem": "-----BEGIN CERTIFICATE-----\nMIICVDCCAfugAwIBAgIQcJ3I4sJZB/aozh8fz5Pu4jAKBggqhkjOPQQDAjB1MQsw\nCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy\nYW5jaXNjbzEaMBgGA1UECgwRdXNlcl9zdGFuZGFyZGNfaW8xHTAbBgNVBAMMFGNh\nLnVzZXJfc3RhbmRhcmRjX2lvMB4XDTIzMDIxMzEwNDEwMFoXDTMzMDIxMDEwNDEw\nMFowdTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcT\nDVNhbiBGcmFuY2lzY28xGjAYBgNVBAoMEXVzZXJfc3RhbmRhcmRjX2lvMR0wGwYD\nVQQDDBRjYS51c2VyX3N0YW5kYXJkY19pbzBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABFZqnLYHyueJRTde2is1GE0NTch7/7wIbic3TWsGp3nIbr/qQOeO4C/sKQcr\na10IeAxOqygPCvX1PhVAyuXIADajbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUE\nFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4E\nIgQgfw82nvAsVC+uPtAETYmU5QFTzfW6e4FYdP713usdKQQwCgYIKoZIzj0EAwID\nRwAwRAIgcbiH6oGe17/7gYJ/8JL7NZSjNzmkdZPOuPX55TD7d+MCICdc+U++8S1j\nCoxSHhmGiDjQ4nejCelav69jwV3KlVqy\n-----END CERTIFICATE-----\n"
},
"httpOptions": {
"verify": false
}
}
}
}
package.json with essentials details
{
"name": "abcd-backend",
"version": "3.0.0-476-230212",
"private": true,
"scripts": {
"start": "nodemon ./bin/www"
},
"dependencies": {
"fabric-ca-client": "^2.2.15",
"fabric-client": "^1.4.18",
"fabric-common": "^2.2.16",
"fabric-network": "^2.2.15",
"grpc": "^1.24.11"
}
}
The error "TypeError:Channel credentials must be a ChannelCredentials object" happens most commonly because the gRPC library that was used to create the ChannelCredentials object does not match the gRPC library that it was passed to to create a Channel. In this case, the error is coming from the library #grpc/grpc-js, but you have a dependency on grpc. If you used grpc to create the credentials object, that would cause this error. You should depend on #grpc/grpc-js instead.

Microsoft Teams Custom App doesn't work on mobile

I've already develop one custom Microsoft Teams app that correctly works on Desktop, but it doesn't work on mobile app.
It only display the page about the debug.
This is the tab into mobile app:
how can I solve it?
Thanks
This is the tab into desktop app:
This is one part of the code of my home tab for my personal app:
class Tab extends React.Component {
constructor(props) {
super(props)
this.state = {
user: null,
loading: true,
isLogged: false,
error: null,
layout: true
}
}
componentDidMount() {
const params = new URLSearchParams(this.props.location.search);
let teamsUser = {
Tid: params.get('tid'),
Aaid: params.get('aaId')
}
getUser(teamsUser).then((userResponse) => {
this.setState({
user: userResponse,
loading: false,
isLogged: true
})
}).catch((error) => {
logger.warn(JSON.stringify(error));
this.setState({
error: error,
loading: false
})
});
}
setLogged = (user) => {
this.setState({
user: user,
isLogged: true,
loading: false
})
}
render() {
let content;
const { user, loading, isLogged, error } = this.state;
if (loading) {
content = <Loading></Loading>
} else if (error) {
throw Error(error)
}
else if (isLogged) {
content = <Catalogue user={user}></Catalogue>
} else {
content = <UserLogin setLogged={this.setLogged}></UserLogin>
}
return (
<Layout>
{content}
</Layout>
);
}
}
export default Tab
and this is my manifest where I put the url with the tid and aaid:
{
"$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.9/MicrosoftTeams.schema.json",
"manifestVersion": "1.9",
"version": "1.0.0",
"id": "86af4197-14c8-4439-a440-3d33b4567f54",
"packageName": "com.microsoft.teams.extension",
"developer": {
"name": "Teams App, Inc.",
"websiteUrl": "https://localhost:3000",
"privacyUrl": "https://localhost:3000/privacy",
"termsOfUseUrl": "https://localhost:3000/termsofuse"
},
"icons": {
"color": "color.png",
"outline": "outline.png"
},
"name": {
"short": "AppLocal",
"full": ""
},
"description": {
"short": "Short description for Personal App.",
"full": "Full description of Personal App."
},
"accentColor": "#FFFFFF",
"staticTabs": [
{
"entityId": "index",
"name": "Catalogue",
"contentUrl": "https://localhost:3000/catalogue?tid={tid}&aaId={userObjectId}",
"websiteUrl": "https://localhost:3000/catalogue",
"scopes": [
"personal"
]
},
{
"entityId": "live",
"name": "Live",
"contentUrl": "https://localhost:3000/live?tid={tid}&aaId={userObjectId}",
"websiteUrl": "https://localhost:3000/live",
"scopes": [
"personal"
]
},
{
"entityId": "about",
"scopes": [
"personal"
]
}
],
"permissions": [
"identity",
"messageTeamMembers"
],
"validDomains": [
"localhost:3000",
"localhost"
]
}
I hope the above mentioned code can help you help me.
I have tested with your code and I replaced localhost URL with ngrok URL it's working fine. Running the application locally does not give you access to Teams app functionality. So could you please try with ngrok url.
I solved it, my error was in the App.js file. I had a wrong path that redirected to another page (the page published above) when try to open the url outside Microsoft Teams. I have remove it and all work's fine. Thank's for all

Alexa skill not asking for permission (notification) when enabling the skill via voice

The skill in question asks for one permission when enabling in Web or app (Outbound Notification). But, when implemented Skill Enabled Event it's not asking user to give notification permission or not. Skill enablement works itself but permission is by default No. How to make alexa to ask for permission when enabling via voice?
Can Alexa prompt them via voice to enable the outbound notification?
skill.json
{
"manifest": {
"publishingInformation": {
"locales": {
"en-US": {
"summary": "test skill summary",
"examplePhrases": [
"Alexa, launch test skill",
"Alexa, open test skill",
"Alexa, start test skill"
],
"keywords": [
"test skill"
],
"name": "test skill",
"description": "test skill Description",
"smallIconUri": "",
"largeIconUri": "",
"updatesDescription": ""
}
},
"isAvailableWorldwide": true,
"testingInstructions": "n/a",
"category": "EVENT_FINDERS",
"distributionCountries": [],
"automaticDistribution": {
"isActive": false
}
},
"apis": {
"custom": {
"endpoint": {
"uri": "arn:aws:lambda:us-east-1:"
},
"interfaces": []
}
},
"manifestVersion": "1.0",
"privacyAndCompliance": {
"allowsPurchases": false,
"locales": {
"en-US": {
"privacyPolicyUrl": "",
"termsOfUseUrl": ""
}
},
"isExportCompliant": true,
"containsAds": false,
"isChildDirected": false,
"usesPersonalInfo": false
},
"events": {
"endpoint": {
"uri": "arn:aws:lambda:us-east-1:"
},
"publications": [
{
"eventName": "AMAZON.MessageAlert.Activated"
},
{
"eventName": "AMAZON.MediaContent.Available"
}
],
"regions": {
"NA": {
"endpoint": {
"uri": "arn:aws:lambda:us-east-1:",
"sslCertificateType": "Trusted"
}
}
},
"subscriptions": [
{
"eventName": "SKILL_PROACTIVE_SUBSCRIPTION_CHANGED"
},
{
"eventName": "SKILL_ENABLED"
},
{
"eventName": "SKILL_DISABLED"
},
{
"eventName": "SKILL_PERMISSION_ACCEPTED"
},
{
"eventName": "SKILL_PERMISSION_CHANGED"
},
{
"eventName": "SKILL_ACCOUNT_LINKED"
}
]
},
"permissions": [
{
"name": "alexa::devices:all:notifications:write"
}
]
}
}
Thank you for the help
There may be a different way, but once you are in the skill I believe you will need to send an ask for permissions card. As I understand it the idea is to make sure that Amazon is involved as a third party permissions granter. This will pop a permissions request in the Alexa app on the users phone. This added layer of security just makes sure the customer saw exactly what permissions they were granting.
You can do this a few different ways in your skill. You could check the first time that the user connects and keep track of that first connection in a persistent customer data layer. Or you could just check if the user has permission when you go to use that part of the skill. If they don't respond telling the customer you sent them a card to grant permissions.
Here is more info on permission cards:
https://developer.amazon.com/en-US/docs/alexa/custom-skills/request-customer-contact-information-for-use-in-your-skill.html#permissions-card-for-requesting-customer-consent
To run reminders via a lambda, other permissions are probably the same format.
const CreateReminderIntent = {
canHandle(handlerInput) {
const { request } = handlerInput.requestEnvelope;
return request.type === 'IntentRequest' && request.intent.name === 'CreateReminderIntent';
},
async handle(handlerInput) {
const { requestEnvelope, serviceClientFactory, responseBuilder } = handlerInput;
const consentToken = requestEnvelope.context.System.user.permissions
&& requestEnvelope.context.System.user.permissions.consentToken;
if (!consentToken) {
return handlerInput.responseBuilder
.addDirective({
type: "Connections.SendRequest",
name: "AskFor",
payload: {
"#type": "AskForPermissionsConsentRequest",
"#version": "1",
"permissionScope": "alexa::alerts:reminders:skill:readwrite"
},
token: "<string>"
})
.getResponse();
}
try {
const speechText = "Great! I've scheduled a reminder for you";
const ReminderManagementServiceClient = serviceClientFactory.getReminderManagementServiceClient();
const reminderPayload = {
"trigger": {
"type": "SCHEDULED_RELATIVE",
"offsetInSeconds": "10",
"timeZoneId": "Europe/London"
},
"alertInfo": {
"spokenInfo": {
"content": [{
"locale": "en-GB",
"text": "Wash the dog"
}]
}
},
"pushNotification": {
"status": "ENABLED"
}
};
await ReminderManagementServiceClient.createReminder(reminderPayload);
return responseBuilder
.speak(speechText)
.getResponse();
} catch (error) {
console.error(error);
return responseBuilder
.speak('Uh Oh. Looks like something went wrong.')
.getResponse();
}
}
};

Alexa skills events not firing when hosted in web service

I have custom skill that calls web service i created. I am able to launch and get other intent, but i am not getting notification when permission for notification is changed by user of my skill. I need he notification event to get user id for sending push notifications later by other service.
Below is my json file:
{
"manifest": {
"apis": {
"custom": {
"endpoint": {
"uri": "https://pathToMyService",
"sslCertificateType": "Wildcard"
},
"interfaces": []
}
},
"events": {
"publications": [
{ "eventName": "AMAZON.TrashCollectionAlert.Activated" },
{ "eventName": "AMAZON.MessageAlert.Activated" }
],
"subscriptions": [
{ "eventName": "SKILL_PROACTIVE_SUBSCRIPTION_CHANGED" },
{ "eventName": "SKILL_ENABLED" },
{ "eventName": "SKILL_DISABLED" },
{ "eventName": "SKILL_PERMISSION_ACCEPTED" },
{ "eventName": "SKILL_PERMISSION_CHANGED" },
],
"regions": {
"NA": {
"endpoint": {
"uri": "https://pathToMyService",
"sslCertificateType": "Wildcard"
}
}
},
"endpoint": {
"uri": "https://pathToMyService",
"sslCertificateType": "Wildcard"
}
},
"manifestVersion": "1.0",
"permissions": [
{ "name": "alexa::devices:all:notifications:write" }
],
"publishingInformation": {
"locales": {
"en-US": { "name": "Test Events" }
}
}
}
}
Below is the Launch request: I have truncated applicatioId, userID, consentToken, deviceId, apiAccessToken
{"version":"1.0","session":{"new":true,"sessionId":"amzn1.echo-api.session.60ad1e76-0872-4e10-b79d-7144cdf3e1c9","application":{"applicationId":"amzn1.ask.skill.59d60703"},"user":{"userId":"amzn1.ask.account.AGB7EOY","permissions":{"consentToken":"eyJ0eXAiOiJKV1"}}},"context":{"System":{"application":{"applicationId":"amzn1.ask.skill.59d60703"},"user":{"userId":"amzn1.ask.account.AGB7EOY","permissions":{"consentToken":"eyJ0eXAiOiJKV1Qi"}},"device":{"deviceId":"amzn1.ask.device.AFNXDZOAEMFDFKK","supportedInterfaces":{}},"apiEndpoint":"https://api.amazonalexa.com","apiAccessToken":"eyJ0eXAiOiJKV1Qi"}},"request":{"type":"LaunchRequest","requestId":"amzn1.echo-api.request.adb318af-1977-4b36-b8ad-0bb4352fa563","timestamp":"2020-03-22T23:37:55Z","locale":"en-US","shouldLinkResultBeReturned":false}}
Thanks
I resolved the issue: When I updated by skill.json file using
ask api update-skill -s amzn1.ask.skill.59d6 -f Test.json
it didn't update properly. I noticed today when I got latest
ask api get-skill -s amzn1.ask.skill.59d6 >Test2.json
the event section was missing. I added back and reapplied and it's working now.

Export AmCharts to image/pdf in React application

Working on an application bootstrapped with create-react-app.
I need to export amChart to jpg/png/pdf formats.
I'm trying to export like in this codepen I've found: codepen export amchart example
var chart = AmCharts.makeChart("chart-header", {
"type": "pie",
"theme": "light",
"dataProvider": [ {
"country": "Czech Republic",
"litres": 301.9
}, {
"country": "Austria",
"litres": 128.3
}, {
"country": "UK",
"litres": 99
}, {
"country": "The Netherlands",
"litres": 50
}],
"valueField": "litres",
"titleField": "country",
"export": {
"enabled": true,
"menu": []
}
})
chart["export"].capture({}, function() {
this.toPNG({}, function(base64) {
console.log(base64)
})
})
But it doesn't work in my case. It gives me: Uncaught TypeError: chart.export.capture is not a function all the time.
So.. right or wrong, below is the simplified solution I've found.
On click "export" button, I make this.setState({ shouldExportChart: true }). In the "render" event listener I check whether it's true, if so, perform export and set to false.
In the same way, calling this.toJPG() we can export to JPG format.
For PDF generation I used jspdf, for archiving - jszip.
Dependencies in package.json:
"#amcharts/amcharts3-react": "^3.0.3",
"amcharts3": "^3.21.13",
"amcharts3-export": "github:amcharts/export"
"file-saver": "^1.3.3",
"fabric-webpack": "^1.6.0-rc.1"
Component.jsx:
import 'amcharts3'
import AmCharts from '#amcharts/amcharts3-react'
import 'amcharts3-export'
import 'fabric-webpack'
import FileSaver from 'file-saver'
const chartConfig = {
options: {
...,
"export": {
"enabled": true,
"menu": []
},
"listeners": [
{
event: 'rendered',
method: (e) => {
if (window.fabric) {
e.chart.export.capture({}, function () {
this.toPNG({}, function (base64) {
this.toBlob({
data: base64,
type: 'image/png'
}, (blob) => {
FileSaver.saveAs(blob, 'chart.png')
})
})
})
}
}
}
]
}
}
<AmCharts.React {...chartConfig} />

Resources