# OAuth ve FastAPI

OAuth, kullanıcı kimlik bilgilerini ifşa etmeden uygulamalara sınırlı erişim izni verilmesi için yaygın olarak kullanılan, erişim devri için açık bir standarttır. FastAPI ile birleştirildiğinde, kullanıcıların Google veya GitHub gibi harici kimlik sağlayıcıları kullanarak oturum açmasına izin veren güvenli API'ler oluşturmanızı sağlar. Tipik bir senaryoda:
- FastAPI, API uç noktalarını tanımlar ve HTTP isteklerini işler.
- OAuth, fastapi.security gibi kütüphaneler veya Authlib gibi harici araçlar kullanılarak entegre edilir.
- Bir kullanıcı oturum açmak istediğinde, FastAPI onu OAuth sağlayıcısının oturum açma sayfasına yönlendirir.
- Başarılı girişten sonra sağlayıcı, bir belirteçle geri yönlendirir.
- FastAPI bu belirteci doğrular ve kullanıcıyı yetkilendirmek veya kullanıcı profil verilerini almak için kullanır.

Bu yaklaşım, parolaların doğrudan işlenmesini önlemeye ve kimlik yönetimini güvenilir sağlayıcılara devretmeye yardımcı olur.

# FastAPI'de Hugging Face OAuth Entegrasyonu

Bu modül, Hugging Face OAuth'ı bir FastAPI uygulamasına entegre etmek için araçlar sağlar. Hugging Face platformunu kullanarak kullanıcı kimlik doğrulamasını, yerel geliştirme için sahte (mocked) davranışı ve Spaces için gerçek OAuth akışını mümkün kılar.

## OAuth Genel Bakış

`attach_huggingface_oauth` işlevi, FastAPI uygulamanıza giriş, çıkış ve geri bildirim uç noktaları ekler. Bir Space içinde kullanıldığında Hugging Face OAuth sistemine bağlanır. Yerel olarak kullanıldığında sahte bir kullanıcı enjekte eder. Space'inize [HF ile Giriş Yap seçeneği ekleme](https://huggingface.co/docs/hub/en/spaces-oauth) hakkında daha fazla bilgi edinmek için buraya tıklayın

### Nasıl kullanılır?

```python
from huggingface_hub import attach_huggingface_oauth, parse_huggingface_oauth
from fastapi import FastAPI, Request

app = FastAPI()
attach_huggingface_oauth(app)

@app.get("/")
def greet_json(request: Request):
    oauth_info = parse_huggingface_oauth(request)
    if oauth_info is None:
        return {"msg": "Not logged in!"}
    return {"msg": f"Hello, {oauth_info.user_info.preferred_username}!"}
```

> [!TIP]
> Ayrıca [OAuth'ın pratikte nasıl çalıştığını gösteren bir örnek](https://huggingface.co/spaces/Wauplin/fastapi-oauth/blob/main/app.py) de ilginizi çekebilir. Daha kapsamlı bir uygulama için, HF OAuth'ı tam ölçekli bir uygulamada uygulayan [medoidai/GiveBackGPT](https://huggingface.co/spaces/medoidai/GiveBackGPT) Space'ine göz atabilirsiniz.

### attach_huggingface_oauth[[huggingface_hub.attach_huggingface_oauth]]

#### huggingface_hub.attach_huggingface_oauth[[huggingface_hub.attach_huggingface_oauth]]

```python
huggingface_hub.attach_huggingface_oauth(app: fastapi.FastAPI, route_prefix: str = '/')
```

[Kaynak](https://github.com/huggingface/huggingface_hub/blob/v2.4.0/src/huggingface_hub/_oauth.py#L124)

OAuth girişini Hugging Face ile etkinleştirmek için bir FastAPI uygulamasına OAuth uç noktaları ekleyin.

Nasıl kullanılır:
- OAuth uç noktalarını eklemek için bu yöntemi FastAPI uygulamanızda çağırın.
- Rota işleyicilerinizin içinde, OAuth bilgilerini almak için `parse_huggingface_oauth(request)` fonksiyonunu çağırın.
- Kullanıcı oturum açmışsa, kullanıcının bilgilerini içeren bir [OAuthInfo](/docs/huggingface_hub/v2.4.0/tr/package_reference/oauth#huggingface_hub.OAuthInfo) nesnesi döndürülür. Aksi halde `None` döndürülür.
- Uygulamanızda, kullanıcının giriş ve çıkış yapması için `/oauth/huggingface/login` ve `/oauth/huggingface/logout` bağlantılarını eklediğinizden emin olun.

Örnek:
```py
from huggingface_hub import attach_huggingface_oauth, parse_huggingface_oauth

# Create a FastAPI app
app = FastAPI()

# Add OAuth endpoints to the FastAPI app
attach_huggingface_oauth(app)

# Add a route that greets the user if they are logged in
@app.get("/")
def greet_json(request: Request):
    # Retrieve the OAuth info from the request
    oauth_info = parse_huggingface_oauth(request)  # e.g. OAuthInfo dataclass
    if oauth_info is None:
        return {"msg": "Not logged in!"}
    return {"msg": f"Hello, {oauth_info.user_info.preferred_username}!"}
```

### parse_huggingface_oauth[[huggingface_hub.parse_huggingface_oauth]]

#### huggingface_hub.parse_huggingface_oauth[[huggingface_hub.parse_huggingface_oauth]]

```python
huggingface_hub.parse_huggingface_oauth(request: fastapi.Request)
```

[Kaynak](https://github.com/huggingface/huggingface_hub/blob/v2.4.0/src/huggingface_hub/_oauth.py#L191)

Giriş yapılmış bir kullanıcının bilgilerini bir [OAuthInfo](/docs/huggingface_hub/v2.4.0/tr/package_reference/oauth#huggingface_hub.OAuthInfo) nesnesi olarak döndürür.

Esneklik ve geleceğe hazırlık amacıyla bu yöntem ayrıştırma konusunda oldukça esnektir ve hata yükseltmez. Eksik alanlar bir uyarı vermeden `None` olarak ayarlanır.

Kullanıcı oturum açmamışsa (oturum çerezi bilgisi yoksa) `None` döndürün.

Bu yöntemin nasıl kullanılacağına dair bir örnek için [attach_huggingface_oauth()](/docs/huggingface_hub/v2.4.0/tr/package_reference/oauth#huggingface_hub.attach_huggingface_oauth) bölümüne bakın.

### OAuthOrgInfo[[huggingface_hub.OAuthOrgInfo]]

#### huggingface_hub.OAuthOrgInfo[[huggingface_hub.OAuthOrgInfo]]

```python
huggingface_hub.OAuthOrgInfo(sub: str, name: str, preferred_username: str, picture: str, plan: str | None = None, can_pay: bool | None = None, role_in_org: str | None = None, security_restrictions: list[typing.Literal['ip', 'token-policy', 'mfa', 'sso']] | None = None)
```

[Kaynak](https://github.com/huggingface/huggingface_hub/blob/v2.4.0/src/huggingface_hub/_oauth.py#L23)

**Parametreler:**

sub (`str`) : Örgüt için benzersiz tanımlayıcı. OpenID Connect alanı.

name (`str`) : Kuruluşun tam adı. OpenID Connect alanı.

preferred_username (`str`) : Kuruluşun kullanıcı adı. OpenID Connect alanı.

picture (`str`) : Kuruluşun profil fotoğrafı URL'si. OpenID Connect alanı.

plan (`str`, *isteğe bağlı*) : Kuruluşun planı (ör. "enterprise", "team"). Hugging Face alanı.

can_pay (`Optional[bool]`, *isteğe bağlı*) : Örgütün bir ödeme yöntemi ayarlayıp ayarlamadığı. Hugging Face alanı.

role_in_org (`Optional[str]`, *isteğe bağlı*) : Kullanıcının organizasyondaki rolü. Hugging Face alanı.

security_restrictions (`Optional[list[Literal["ip", "token-policy", "mfa", "sso"]]]`, *isteğe bağlı*) : Kullanıcının bu kuruluş için tamamlamadığı güvenlik kısıtlamalarının dizisi. Olası değerler: "ip", "token-policy", "mfa", "sso". Hugging Face alanı.

OAuth ile oturum açmış bir kullanıcıya bağlı bir kuruluş hakkında bilgi.

### OAuthUserInfo[[huggingface_hub.OAuthUserInfo]]

#### huggingface_hub.OAuthUserInfo[[huggingface_hub.OAuthUserInfo]]

```python
huggingface_hub.OAuthUserInfo(sub: str, name: str, preferred_username: str, email_verified: bool | None, email: str | None, picture: str, profile: str, website: str | None, is_pro: bool, can_pay: bool | None, orgs: list[huggingface_hub._oauth.OAuthOrgInfo] | None)
```

[Kaynak](https://github.com/huggingface/huggingface_hub/blob/v2.4.0/src/huggingface_hub/_oauth.py#L57)

**Parametreler:**

sub (`str`) : Kullanıcının benzersiz tanımlayıcısı, yeniden adlandırma durumunda bile. OpenID Connect alanı.

name (`str`) : Kullanıcının tam adı. OpenID Connect alanı.

preferred_username (`str`) : Kullanıcının kullanıcı adı. OpenID Connect alanı.

email_verified (`Optional[bool]`, *isteğe bağlı*) : Kullanıcının e-posta adresinin doğrulanıp doğrulanmadığını belirtir. OpenID Connect alanı.

email (`Optional[str]`, *isteğe bağlı*) : Kullanıcının e-posta adresi. OpenID Connect alanı.

picture (`str`) : Kullanıcının profil fotoğrafı URL'si. OpenID Connect alanı.

profile (`str`) : Kullanıcının profil URL'si. OpenID Connect alanı.

website (`Optional[str]`, *isteğe bağlı*) : Kullanıcının web sitesi URL'si. OpenID Connect alanı.

is_pro (`bool`) : Kullanıcının pro kullanıcısı olup olmadığı. Hugging Face alanı.

can_pay (`Optional[bool]`, *isteğe bağlı*) : Kullanıcının bir ödeme yöntemi ayarlayıp ayarlamadığı. Hugging Face alanı.

orgs (`Optional[list[OrgInfo]]`, *isteğe bağlı*) : Kullanıcının üye olduğu kuruluşların listesi. Hugging Face alanı.

OAuth ile oturum açmış bir kullanıcı hakkında bilgi.

### OAuthInfo[[huggingface_hub.OAuthInfo]]

#### huggingface_hub.OAuthInfo[[huggingface_hub.OAuthInfo]]

```python
huggingface_hub.OAuthInfo(access_token: str, access_token_expires_at: datetime, user_info: OAuthUserInfo, state: str | None, scope: str)
```

[Kaynak](https://github.com/huggingface/huggingface_hub/blob/v2.4.0/src/huggingface_hub/_oauth.py#L100)

**Parametreler:**

access_token (`str`) : Erişim belirteci.

access_token_expires_at (`datetime.datetime`) : Erişim jetonunun son kullanma tarihi.

user_info ([OAuthUserInfo](/docs/huggingface_hub/v2.4.0/tr/package_reference/oauth#huggingface_hub.OAuthUserInfo)) : Kullanıcı bilgileri.

state (`str`, *isteğe bağlı*) : OAuth sağlayıcısına, OAuth sağlayıcısına yapılan orijinal istekte iletilen durum.

scope (`str`) : Verilen kapsam.

OAuth oturum açma bilgileri.

