djangorestframework-casdoor 1.0
djangorestframework-casdoor is a Django REST framework authentication plugin for Casdoor.
License: Apache License 2.0
Requires Python: >=3.6

# Django-REST-Framework-Casdoor
`djangorestframework-casdoor` is a Django REST framework authentication plugin for Casdoor.
## Features
- [x] Login with Casdoor
- [x] Verify Casdoor token
- [x] Built-in login view and callback view
- [x] Compatible with `rest_framework`
- [x] Compatible with `django.contrib.auth`
## Install
```shell
pip install Django djangorestframework casdoor djangorestframework-casdoor
```
## Configuration
### Configure `INSTALLED_APPS`
```python
INSTALLED_APPS = [
    ...,
    'rest_framework_casdoor'
]
```
### Configure `AUTHENTICATION_BACKENDS`
```python
AUTHENTICATION_BACKENDS = [
    ...,
    'rest_framework_casdoor.backends.CasdoorBackend'
]
```
### Configure `REST_FRAMEWORK`
```python
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_casdoor.authentication.CasdoorAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication'
    ]
}
```
### Configure `rest_framework_casdoor`
```python
REST_CASDOOR = {
    'CASDOOR_CERT': '''''',
    'CASDOOR_APP_NAME': '',
    'CASDOOR_ENDPOINT': '',
    'CASDOOR_CLIENT_ID': '',
    'CASDOOR_CLIENT_SECRET': '',
    'CASDOOR_ORG_NAME': '',
    'CASDOOR_FRONT_ENDPOINT': '',
    'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',
    'AUTH_TYPE_NAME': ('Bearer', 'JWT'),
    'AUTH_USER_ID_FIELD': 'id',
    'AUTO_CREATE_USER': True,
}
```
> More configuration of `rest_framework_casdoor` please see below
## Usage
### Login
you can use `rest_framework_casdoor` built-in view to login, and get the token.
```python
urlpatterns = [
    # path('admin/', admin.site.urls),
    path('', include('rest_framework_casdoor.urls', namespace='rest_framework_casdoor'))
]
```
Or you can write your own login view to get token and authenticate user.
### Use with `rest_framework`
You can easily write a `rest_framework`'s API views to verify current user's permission.

For `CBV`:
```python
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_casdoor.authentication import CasdoorAuthentication


class ExampleView(APIView):
    authentication_classes = [CasdoorAuthentication]
    permission_classes = [IsAuthenticated]

    def get(self, request, format=None):
        content = {
            'user': str(request.user),  # `django.contrib.auth.User` instance.
            'auth': str(request.auth),  # None
        }
        return Response(content)

```
For `FBV`:
```python
@api_view(['GET'])
@authentication_classes([CasdoorAuthentication])
@permission_classes([IsAuthenticated])
def example_view(request, format=None):
    content = {
        'user': str(request.user),  # `django.contrib.auth.User` instance.
        'auth': str(request.auth),  # token
    }
    return Response(content)

```
## Configuration of `rest_framework_casdoor`
```python
DEFAULTS = {
    'CASDOOR_CERT': '',
    'CASDOOR_APP_NAME': '',
    'CASDOOR_ENDPOINT': '',
    'CASDOOR_CLIENT_ID': '',
    'CASDOOR_CLIENT_SECRET': '',
    'CASDOOR_ORG_NAME': '',
    'CASDOOR_FRONT_ENDPOINT': '',
    'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',
    'AUTH_TYPE_NAME': ('Bearer',),
    'AUTO_CREATE_USER': False,
    'CASDOOR_TO_AUTH_MODEL': {
        'address': 'address',
        'affiliation': 'affiliation',
        'avatar': 'avatar',
        'bio': 'bio',
        'birthday': 'birthday',
        'createdIp': 'created_ip',
        'createdTime': 'created_time',
        'displayName': 'display_name',
        'education': 'education',
        'email': 'email',
        'emailVerified': 'email_verified',
        'firstName': 'first_name',
        'gender': 'gender',
        'homepage': 'homepage',
        'idCard': 'id_card',
        'idCardType': 'id_card_type',
        'isAdmin': 'is_staff',
        'isDeleted': 'is_deleted',
        'isGlobalAdmin': 'is_superuser',
        'isOnline': 'is_online',
        'language': 'language',
        'lastName': 'last_name',
        'lastSigninIp': 'last_signin_ip',
        'lastSigninTime': 'last_signin_time',
        'lastSigninWrongTime': 'last_signin_wrong_time',
        'location': 'location',
        'name': 'username',
        'owner': 'owner',
        'password': 'password',
        'passwordSalt': 'password_salt',
        'permanentAvatar': 'permanent_avatar',
        'phone': 'phone',
        'properties': 'properties',
        'ranking': 'ranking',
        'region': 'region',
        'scope': 'scope',
        'score': 'score',
        'signinWrongTimes': 'signin_wrong_times',
        'signupApplication': 'signup_application',
        'title': 'title',
        'updatedTime': 'updated_time'
    }
}
```
### Required configuration
`CASDOOR_CERT`: Casdoor public key，to verify casdoor token.

`CASDOOR_APP_NAME`: Casdoor app name that you use.

`CASDOOR_ENDPOINT`: Casdoor endpoint.

`CASDOOR_CLIENT_ID`: Casdoor client id.

`CASDOOR_CLIENT_SECRET`: Casdoor client secret.

`CASDOOR_ORG_NAME`: Casdoor organization name.

`CASDOOR_FRONT_ENDPOINT`: Casdoor front endpoint, could be same as `CASDOOR_ENDPOINT`
### Optional configuration
`AUTH_HEADER_NAME`: The header name that contains the token.

`AUTH_TYPE_NAME`: The type of the token.

`AUTO_CREATE_USER`: Whether to automatically create a user that does not exist in the database(if set this `True`, you need to configure `CASDOOR_TO_AUTH_MODEL` with your `auth` user model).

`CASDOOR_TO_AUTH_MODEL`: Casdoor field name corresponding to Django User model field name, used to pass parameters when creating users.

## TODO
- [ ] Get user info from Casdoor
- [ ] Update user info in Django
- [ ] Permission control