diff --git a/developing-with-nats/intro-2/nkey.md b/developing-with-nats/intro-2/nkey.md index f122882..e8345cc 100644 --- a/developing-with-nats/intro-2/nkey.md +++ b/developing-with-nats/intro-2/nkey.md @@ -4,5 +4,124 @@ The 2.0 version of NATS server introduces a new challenge response authenticatio Handling challenge response may require more than just a setting in the connection options, depending on the client library. -!INCLUDE "../../\_examples/connect\_nkey.html" +{% tabs %} +{% tab title="Go" %} +```go +opt, err := nats.NkeyOptionFromSeed("seed.txt") +if err != nil { + log.Fatal(err) +} +nc, err := nats.Connect("127.0.0.1", opt) +if err != nil { + log.Fatal(err) +} +defer nc.Close() + +// Do something with the connection +``` +{% endtab %} + +{% tab title="Java" %} +```java +NKey theNKey = NKey.createUser(null); // really should load from somewhere +Options options = new Options.Builder(). + server("nats://localhost:4222"). + authHandler(new AuthHandler(){ + public char[] getID() { + try { + return theNKey.getPublicKey(); + } catch (GeneralSecurityException|IOException|NullPointerException ex) { + return null; + } + } + + public byte[] sign(byte[] nonce) { + try { + return theNKey.sign(nonce); + } catch (GeneralSecurityException|IOException|NullPointerException ex) { + return null; + } + } + + public char[] getJWT() { + return null; + } + }). + build(); +Connection nc = Nats.connect(options); + +// Do something with the connection + +nc.close(); +``` +{% endtab %} + +{% tab title="JavaScript" %} +```javascript +// seed should be stored in a file and treated like a secret +const seed = 'SUAEL6GG2L2HIF7DUGZJGMRUFKXELGGYFMHF76UO2AYBG3K4YLWR3FKC2Q'; + +let nc = NATS.connect({ + url: server.nats, + nkey: 'UD6OU4D3CIOGIDZVL4ANXU3NWXOW5DCDE2YPZDBHPBXCVKHSODUA4FKI', + sigCB: function (nonce) { + const sk = nkeys.fromSeed(Buffer.from(seed)); + return sk.sign(nonce); + } +}); +``` +{% endtab %} + +{% tab title="Python" %} +```python +nc = NATS() + +async def error_cb(e): + print("Error:", e) + +await nc.connect("nats://localhost:4222", + nkeys_seed="./path/to/nkeys/user.nk", + error_cb=error_cb, + ) + +# Do something with the connection + +await nc.close() +``` +{% endtab %} + +{% tab title="Ruby" %} +```ruby +require 'nats/client' + +NATS.start(max_outstanding_pings: 5) do |nc| + nc.on_reconnect do + puts "Got reconnected to #{nc.connected_server}" + end + + nc.on_disconnect do |reason| + puts "Got disconnected! #{reason}" + end + + # Do something with the connection +end +``` +{% endtab %} + +{% tab title="TypeScript" %} +```typescript +// seed should be stored in a file and treated like a secret +const seed = 'SUAEL6GG2L2HIF7DUGZJGMRUFKXELGGYFMHF76UO2AYBG3K4YLWR3FKC2Q'; + +let nc = await connect({ + url: server.nats, + nkey: 'UD6OU4D3CIOGIDZVL4ANXU3NWXOW5DCDE2YPZDBHPBXCVKHSODUA4FKI', + nonceSigner: function (nonce) { + const sk = fromSeed(Buffer.from(seed)); + return sk.sign(Buffer.from(nonce)); + } +}); +``` +{% endtab %} +{% endtabs %}