Code Monkey home page Code Monkey logo

Comments (12)

nmcb avatar nmcb commented on June 12, 2024 2

thanks @fedefernandez! we'll give it a try.

cc @thijsnissen

from github4s.

loonydev avatar loonydev commented on June 12, 2024 1

Okay, next week I'm going to prepare this changes and will discuss it with real example.

from github4s.

BenFradet avatar BenFradet commented on June 12, 2024

You're right we don't support github apps authorization.
However, I'm not sure about the best way to go about it as we don't want to handle jwt tokens directly in the library for example.

from github4s.

loonydev avatar loonydev commented on June 12, 2024

Agreed, maybe we can make GithubClient to accept instance of GithubAuth, so the user can use by default GithubPatAuth, in other cases they need to define own class.

But if it's part of Github Auth flow user will do same code over and over.

from github4s.

loonydev avatar loonydev commented on June 12, 2024

So, do you have any suggestions how to implement it?
I can do that, by I need to be sure that I don't waste a time.

from github4s.

BenFradet avatar BenFradet commented on June 12, 2024

maybe we can make GithubClient to accept instance of GithubAuth, so the user can use by default GithubPatAuth, in other cases they need to define own class.

I'm 👍 on that

from github4s.

loonydev avatar loonydev commented on June 12, 2024

But as I mention before, users will do same code over and over and not in the best way. It's like give them domain and say, use own http sender.

from github4s.

BenFradet avatar BenFradet commented on June 12, 2024

We can add that code as documentation, it doesn't seem to me like the usage will be so huge that it would need to be part of the library.

from github4s.

kusaeva avatar kusaeva commented on June 12, 2024

@loonydev Hi! Are you still planning to make a PR with this changes?

from github4s.

loonydev avatar loonydev commented on June 12, 2024

Morning @kusaeva, not yet, it's in plan, but not in a near future. If you have a time to make it, it would be great.

from github4s.

nmcb avatar nmcb commented on June 12, 2024

Hello - I'm interested about the status of this issue

We have a standalone service in our infrastructure that requires broad access to GH's REST api and the repositories under our organisation (DHL-Parcel) - preferably using the github4s library and authorise not via a personal access token - but either via JWT tokens or - as requested in this issue - via GH Apps authorisation.

We did try the new AccessToken feature to get this working but weren't able to. The main issue seems to be the Authorisation: token header being hardcoded in the library, but we might not understand the way the new features was intended to be used. In that case an example would help us.

If authorisation via JWT or GH App tokens is currently not possible we would able to spend some time on getting this to work with github4s provided that we get some help and pointers on how the preferred integration should look like in the API.

Thanks in advance :)

from github4s.

fedefernandez avatar fedefernandez commented on June 12, 2024

Hi @nmcb, thanks for your interest.

This is how it's currently built.

We have an algebra that allows generating tokens:

trait AccessToken[F[_]] {
def withAccessToken[T](f: Option[String] => F[GHResponse[T]]): F[GHResponse[T]]
}

This algebra has a single implementation called StaticAccessToken. You pass a token, and it returns as a pure value.

class StaticAccessToken[F[_]](accessToken: Option[String]) extends AccessToken[F] {
override def withAccessToken[T](f: Option[String] => F[GHResponse[T]]): F[GHResponse[T]] =
f(accessToken)
}

When you create a new Github4s client, it's creates an instance of that algebra to use it internally:

new Github[F](client, new StaticAccessToken(accessToken))

This is then used to create the internal GithubAPIv3 algebra:

private lazy val module: GithubAPIs[F] = new GithubAPIv3[F](client, config, accessToken)

That, in a similar way, pass it to the internal HTTPClient algebra:

implicit val httpClient: HttpClient[F] = new HttpClient[F](client, config, accessToken)

The HTTPClient uses the withAccessToken to get the token and pass it to the RequestBuilder

withAccessToken(accessToken =>
runWithoutResponse[Unit](
RequestBuilder(buildURL(url)).withHeaders(headers).withAuth(accessToken)
)
)

The RequestBuilder stores the token in a authHeader map, where the key is Authorization, and the value is s"token $token".

def withAuth(accessToken: Option[String] = None): RequestBuilder[Res] =
this.copy(authHeader = accessToken match {
case Some(token) => Map("Authorization" -> s"token $token")
case _ => Map.empty[String, String]
})

This is mapped to a Header.Raw

self.authHeader.map(kv => Header.Raw(CIString(kv._1), kv._2))).toList

Potential solution

@loonydev's approach looks good, so I've created a draft with a potential solution:

In that way, you can implement your algebra for generating auth headers, having complete control. Let me know your thoughts. The docs need to be updated accordingly.

from github4s.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.