55 "crypto/ecdsa"
66 "crypto/elliptic"
77 "crypto/rand"
8+ "crypto/x509"
89 "errors"
910 "fmt"
1011 "os"
@@ -27,11 +28,19 @@ type Account struct {
2728 gatherings * discovery.GatheringsService
2829}
2930
31+ type accountTokenSource struct {
32+ account * Account
33+ }
34+
35+ func (a * accountTokenSource ) Token () (t * oauth2.Token , err error ) {
36+ return a .account .Token (context .Background ())
37+ }
38+
3039func (a * Account ) Name () string {
3140 return a .name
3241}
3342
34- func (a * Account ) Token () (t * oauth2.Token , err error ) {
43+ func (a * Account ) Token (ctx context. Context ) (t * oauth2.Token , err error ) {
3544 if a .token == nil {
3645 return nil , ErrNotLoggedIn
3746 }
@@ -60,11 +69,11 @@ func (a *Account) Discovery() (d *discovery.Discovery, err error) {
6069}
6170
6271func (a * Account ) PlayfabXblToken (ctx context.Context ) (* xbox.XBLToken , error ) {
63- liveToken , err := a .Token ()
72+ liveToken , err := a .Token (ctx )
6473 if err != nil {
6574 return nil , err
6675 }
67- return xbox .RequestXBLToken (ctx , liveToken , "rp://[ playfabapi.com/](https://playfabapi.com/) " , a .token .XboxDeviceType ())
76+ return xbox .RequestXBLToken (ctx , liveToken , "rp://playfabapi.com/" , a .token .XboxDeviceType ())
6877}
6978
7079func (a * Account ) MCToken (ctx context.Context ) (* discovery.MCToken , error ) {
@@ -115,7 +124,7 @@ func (a *Account) Gatherings(ctx context.Context) (*discovery.GatheringsService,
115124
116125func (a * Account ) Realms () * realms.Client {
117126 if a .realms == nil {
118- a .realms = realms .NewClient (a , nil , "" )
127+ a .realms = realms .NewClient (& accountTokenSource { account : a } , nil , "" )
119128 }
120129 return a .realms
121130}
@@ -148,18 +157,44 @@ func (a *Account) Chain(ctx context.Context) (ChainKey *ecdsa.PrivateKey, ChainD
148157 return ch .ChainKey , ch .ChainData , nil
149158}
150159
151- func (a * Account ) authChain (ctx context.Context ) (key * ecdsa.PrivateKey , chain string , err error ) {
152- key , _ = ecdsa .GenerateKey (elliptic .P384 (), rand .Reader )
153- liveToken , err := a .Token ()
160+ func (a * Account ) PfToken (ctx context.Context , publicKey * ecdsa.PublicKey ) (string , error ) {
161+ discovery , err := a .Discovery ()
154162 if err != nil {
155- return nil , "" , fmt .Errorf ("request Live Connect token: %w" , err )
163+ return "" , err
164+ }
165+ authService , err := discovery .AuthService ()
166+ if err != nil {
167+ return "" , err
168+ }
169+ mcToken , err := a .MCToken (ctx )
170+ if err != nil {
171+ return "" , err
172+ }
173+
174+ keyData , _ := x509 .MarshalPKIXPublicKey (publicKey )
175+ signedToken , _ , err := authService .MultiplayerSessionStart (ctx , keyData , mcToken )
176+ return signedToken , err
177+ }
178+
179+ func (a * Account ) XBLToken (ctx context.Context ) (* auth.XBLToken , error ) {
180+ liveToken , err := a .Token (ctx )
181+ if err != nil {
182+ return nil , fmt .Errorf ("request Live Connect token: %w" , err )
156183 }
157184 xsts , err := xbox .RequestXBLToken (ctx , liveToken , "https://multiplayer.minecraft.net/" , a .token .XboxDeviceType ())
158185 if err != nil {
159- return nil , "" , fmt .Errorf ("request XBOX Live token: %w" , err )
186+ return nil , fmt .Errorf ("request XBOX Live token: %w" , err )
160187 }
161- xstsa := & auth.XBLToken {
188+ return & auth.XBLToken {
162189 AuthorizationToken : xsts .AuthorizationToken ,
190+ }, nil
191+ }
192+
193+ func (a * Account ) authChain (ctx context.Context ) (key * ecdsa.PrivateKey , chain string , err error ) {
194+ key , _ = ecdsa .GenerateKey (elliptic .P384 (), rand .Reader )
195+ xstsa , err := a .XBLToken (ctx )
196+ if err != nil {
197+ return nil , "" , err
163198 }
164199 chain , err = auth .RequestMinecraftChain (ctx , xstsa , key )
165200 if err != nil {
0 commit comments